1 基本概述

采用threading.Lock()对象创建锁lock,即 lock = threading.Lock()

其相关方法主要有

lock.acquire() # lock the lock, possibly blocking until it can be obtained
lock.release() # unlock of the lock
lock.locked() # test whether the lock is currently locked

Lock(指令锁)是可用的最低级的同步指令;Lock处于锁定状态时,不被特定的线程拥有。

2 示例1

2.1 异常分析

import threading
import time

a = b =0

def value():
    while True:
        if a != b :
            print("a = %d,b =%d"%(a,b))

t=threading.Thread(target=value)
t.start()
while True:
    a += 1
    b += 1

t.join()

运行结果为一串数字

...
a = 3361552,b =3361551
a = 3361552,b =3361551
a = 3361552,b =3361551
a = 3361552,b =3361551
a = 3361552,b =3361551
...

说明:

(1)按照程序分析来讲,应该没有输出,

(2)打印出好多相同的数字

可能原因

(1)首先明确a b为全局变量,所以当全局变量a b的值发生变化时,进程中的a b值也会随之变化

(2)当主线程中while True 使的a b均+1 时,线程函数中的a b值也会发生变化;但是主线程中的a b值赋值过程有时间间隔, 而线程中没有阻塞函数,所以在a b赋值中间的一个时刻,存在有a != b 这个过程,满足了线程函数的打印条件;所以会有数值打印出来

(3)在运行过程中,CPU高达100%,此时while 赋值运行和线程函数的运行并不是完全一致的,所以出现了数值较大的波动,有的数值仅出现一次或几次,有的数值甚至出现几十次。

(4)会出现当a赋值,当b没有赋值的间隙,子线程执行打印到桌面

2.2 添加sleep时间

import threading
import time

a = b =0

def value():
    while True:
        if a != b :
            print("a = %d,b =%d"%(a,b))

t=threading.Thread(target=value)
t.start()
while True:
    time.sleep(1) #添加sleep(1)时间
    a += 1
    b += 1

t.join()

运行

a = 3,b =3
a = 6,b =6
a = 15,b =15
a = 16,b =16
a = 17,b =17
a = 18,b =18
a = 19,b =19
a = 20,b =20

说明:

(1)打印出的数据之间的间隔不是“等差”关系

(2)运行过程可能是,

(a)a+1 赋值后,b尚未赋值,中间时间内线程判定出 a != b 为 True

(b)在print打印前,b+1赋值已经完成,而sleep(1)后,循环赋值中的a+1被阻塞;

(c)所以此时打印出的 a b值想等。

(3)为了说明 2 的过程,在b += 1 前添加 sleep(1),则打印出a的值比b的值均大1;且a b相同值行数达上百行

(4)从 2 和 3 过程可以说明线

2.3 颠倒交换

import threading
import time

a = b =0

def value():
    while True:
        # 不添加global关键词,
        # 则会 UnboundLocalError : local variable 'a' referenced before assignment
        # 也即在赋值前没有定义局部变量 a b
        global a
        global b

        a += 1
        b += 1

t=threading.Thread(target=value)
t.start()
while True:
    if a != b:
        print("a = %d,b =%d" % (a, b))

t.join()

说明:

该出a b本是全局变量,而当不添加关键字global时则会出现未定义局部变量的报错。——暂时还没有搞懂为什么!

3 示例2

使用进程锁Lock

import threading

a = b =0

# 创建线程锁对象
lock = threading.Lock()

def value():
    while True:
        lock.acquire()
        if a != b :
          print("a = %d,b =%d"%(a,b))
        lock.release()

t=threading.Thread(target=value)
t.start()
while True:
    lock.acquire()
    a += 1
    b += 1
    lock.release()

t.join()

运行,文件一直没有打印出内容

说明

(1)在a b 赋值时加锁,另外一个再加锁,这时候才会阻塞,此时不会打印。

(2)不管是子线程中的while循环 ,还是主线程中的while循环,任意一个去掉 lock.acquire  lock.release 后,均不会出现阻塞。均会打印输出内容。

pythonl练习笔记——threading创建进程锁Lock()的更多相关文章

  1. python从入门到放弃之进程锁lock

    # ### lock (互斥锁)"""# 应用在多进程当中# 互斥锁lock : 互斥锁是进程间的get_ticket互相排斥进程之间,谁先抢占到资源,谁就先上锁,等到解 ...

  2. 13.1、多进程:进程锁Lock、信号量、事件

    进程锁: 为什么要有进程锁:假如现在有一台打印机,qq要使用打印机,word文档也要使用打印机,如果没有使用进程锁,可能会导致一些问题,比如QQ的任务打印到一半,Word插进来,于是打印出来的结果是各 ...

  3. python学习笔记——多进程中的锁Lock

    1 进程锁 python编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性. 每个对象都对应于一个可称为“互斥锁”的标记,这个标记用来保证在任一时刻,只能有一线程访问对象. 在python中我 ...

  4. 进程锁Lock

    例1: 10个人去买票,先去查询余票,有票就去购买.代码如下: # ticket.py {"ticket": 1} # 只有一张票 import json import time ...

  5. 进程锁 Lock

    进程锁其实是锁的输入终端,屏幕,太多的进程,为了防止打印错乱而锁,作用不大 from multiprocessing import Process, Lock def f(l, i): l.acqui ...

  6. pythonl练习笔记——threading线程中的事件Event

    1 事件Event 使用方法:e = threading.Event() Event对象主要用于线程间通信,确切地说是用于主线程控制其他线程的执行. Event事件提供了三个方法:wait等待.cle ...

  7. python 多进程锁Lock和共享内存

    多进程锁 lock = multiprocessing.Lock() 创建一个锁 lock.acquire() 获取锁 lock.release() 释放锁 with lock: 自动获取.释放锁 类 ...

  8. python线程互斥锁Lock(29)

    在前一篇文章 python线程创建和传参 中我们介绍了关于python线程的一些简单函数使用和线程的参数传递,使用多线程可以同时执行多个任务,提高开发效率,但是在实际开发中往往我们会碰到线程同步问题, ...

  9. python笔记9 线程进程 threading多线程模块 GIL锁 multiprocessing多进程模块 同步锁Lock 队列queue IO模型

    线程与进程 进程 进程就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成.我们编写的程序用来描述进程要完成哪些功能以及如何完成:数据集则是程序在执行过程中所需要 ...

随机推荐

  1. Java按键事件KeyEvent

    按键事件可以利用键盘来控制和执行一些动作,或者从键盘上获取输入,只要按下,释放一个键或者在一个组件上敲击,就会触发按键事件.KeyEvent对象描述事件的特性(按下,放开,或者敲击一个键)和对应的值. ...

  2. guess-number-higher-or-lower-ii

    // https://discuss.leetcode.com/topic/51353/simple-dp-solution-with-explanation // https://en.wikipe ...

  3. 如何在脚本中执行SQL语句并获得结果输出?

    这里需要用到的工具叫做sqlcmd.exe, 它随SQL server的安装而安装. 该可执行程序的位置在: C:\Program Files\Microsoft SQL Server\xxx\Too ...

  4. 删除在Godaddy注册的域名,申请退款的全过程

    1,删除域名. 登录进 Godaddy ,进入域名管理(Domain Manager),点击你要删除的域名,把要删除的域名前面打上对勾,再点击“delete selected”,确认,稍等一会就删除了 ...

  5. jquery圆角插件

    为了实现div的圆角效果,你还在用古老的背景图片拼凑的方法吗?还是在用各种浏览器不互相兼容的CSS方式?如果你还在用这样的方式实现圆角,那我告诉你你真的out了,或许是我out了,竟然以前没发现有这样 ...

  6. 【面试必读】一不注意就做错的五道JavaScript题目

    如果不会,可以存在DW中运行试一下哦~ 1.这段代码会输出什么? function Container( properties ) { var objthis = this; for ( var i  ...

  7. 有关于腾讯地图服务端IP定位接口的获取当前城市的处理

    接口说明:http://apis.map.qq.com/ws/location/v1/ip 说明里面写了ip可以缺省,然并卵,经过测试的到结果并不能获取到当前城市,理由是腾讯ip库的对应ip精度没有定 ...

  8. VS2008+Windows DDK 7的环境配置(二)

    在第一篇的基础上,进行如下的步骤,就可以编译出X64的驱动程序. (建议再另外建一个项目,这样避免混淆,因为x86和x64编译的有些编译选项是不同的.) 1. 安装VS2008 x64 build 组 ...

  9. sqlplus的使用

    1.连接数据库 sqlplus / as sysdba 2.连接到远程数据库 sqlplus 用户名/密码@服务命名 3.遇到&会当成变量,一般是不需要的,可以关掉 SQL> set d ...

  10. 。一个通俗易懂的HMM例子

    原文链接地址:http://www.52nlp.cn/hmm-concrete-example-on-wiki/ Alice 和Bob是好朋友,但是他们离得比较远,每天都是通过电话了解对方那天作了什么 ...