pythonl练习笔记——threading创建进程锁Lock()
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()的更多相关文章
- python从入门到放弃之进程锁lock
# ### lock (互斥锁)"""# 应用在多进程当中# 互斥锁lock : 互斥锁是进程间的get_ticket互相排斥进程之间,谁先抢占到资源,谁就先上锁,等到解 ...
- 13.1、多进程:进程锁Lock、信号量、事件
进程锁: 为什么要有进程锁:假如现在有一台打印机,qq要使用打印机,word文档也要使用打印机,如果没有使用进程锁,可能会导致一些问题,比如QQ的任务打印到一半,Word插进来,于是打印出来的结果是各 ...
- python学习笔记——多进程中的锁Lock
1 进程锁 python编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性. 每个对象都对应于一个可称为“互斥锁”的标记,这个标记用来保证在任一时刻,只能有一线程访问对象. 在python中我 ...
- 进程锁Lock
例1: 10个人去买票,先去查询余票,有票就去购买.代码如下: # ticket.py {"ticket": 1} # 只有一张票 import json import time ...
- 进程锁 Lock
进程锁其实是锁的输入终端,屏幕,太多的进程,为了防止打印错乱而锁,作用不大 from multiprocessing import Process, Lock def f(l, i): l.acqui ...
- pythonl练习笔记——threading线程中的事件Event
1 事件Event 使用方法:e = threading.Event() Event对象主要用于线程间通信,确切地说是用于主线程控制其他线程的执行. Event事件提供了三个方法:wait等待.cle ...
- python 多进程锁Lock和共享内存
多进程锁 lock = multiprocessing.Lock() 创建一个锁 lock.acquire() 获取锁 lock.release() 释放锁 with lock: 自动获取.释放锁 类 ...
- python线程互斥锁Lock(29)
在前一篇文章 python线程创建和传参 中我们介绍了关于python线程的一些简单函数使用和线程的参数传递,使用多线程可以同时执行多个任务,提高开发效率,但是在实际开发中往往我们会碰到线程同步问题, ...
- python笔记9 线程进程 threading多线程模块 GIL锁 multiprocessing多进程模块 同步锁Lock 队列queue IO模型
线程与进程 进程 进程就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成.我们编写的程序用来描述进程要完成哪些功能以及如何完成:数据集则是程序在执行过程中所需要 ...
随机推荐
- 【属性动画总结】Property Animation
属性动画概述 3.0以前,android仅支持两种动画模式,tweened animation 和 frame-by-frame animation,在android3.0中又引入了一个新的动画系统: ...
- 11个JavaScript颜色选择器插件
几年前,很难找到一个合适的颜色选择器.正好看到很多不错的JavaScript颜色选择器插件,故而把这些编译汇总.在本文,Web设计师和开发人员 Kevin Liew 选取了11个相应插件,有些会比较复 ...
- word 文档如何加密
给Word文档加密主要有以下几个方法:文件加密文件菜单设置:1.打开需要加密的Word文档.2.选“文件”的“另存为”,出现“另存为”对话框,在“工具”中选“常规选项”,出现“保存”选项卡.3.分别在 ...
- 使用Gnupg对Linux系统中的文件进行加密
GnuPG(GNU Privacy Guard或GPG)是一个以GNU通用公共许可证释出的开放源码用于加密或签名的软件,可用来取代PGP.大多数gpg软件仅支持命令行方式,一般人较难掌握.由于gpg软 ...
- (转)初识 Lucene
Lucene 是一个基于 Java 的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能.Lucene 目前是 Apache Jakarta 家族中的一个开源项目. ...
- Highstock生成股票K线图
在线演示 本地下载 使用HightStock生成股票K线图例子.
- iOS用户体验之-导航之道
iOS用户体验之-导航之道 用户不会意识到有导航指向的存在除非他遇到非预期的效果. 能够说导航时逻辑跳转的节点.所以导航对用户体验是至关重要的. iOS中有三种类型的导航.每一种适合不同类型的app. ...
- ZH奶酪:PHP中添加HTML代码的三种方法
php中添加HTML代码,就是php类型的文件中添加html代码~ 第一种是在HTML中加PHP. 大段大段的html代码中,在各个需要执行php的地方<?php .... ?> 比如 l ...
- js绝招
1.JS判断 function IsDigit(cCheck) { //判断是否是数字return (('0'<=cCheck) && (cCheck<='9')); } ...
- 使用QQ截图右键菜单
(1)登录QQ: (2)同时按住Shift+Ctrl+Alt+A四个键,然后点击右键: (3)松开Shift键(只松开Shift键,其他键不要松开).惊喜出现了吧!