关于Threading中Lock的理解
iiyi
关于Threading中Lock的理解
Lock的作用
刚开始接触python,对于线程中的锁不是很理解,错误的把Lock实现的效果当作Lock的作用。
- Lock的效果是保证同一时间只有一个线程操作公共资源(全局变量),比如互斥锁,多个线程同时加同一个锁,只有该锁释放时,其他线程才能获取该锁。至于哪个线程先获取该锁是无序的,如下。
- Lock的作用和效果不同,通过其不同的用法最终实现不同的效果。
- 锁对象(Lock)具有获取和释放两种状态,创建时处于释放状态。
- 默认创建的Lock具有阻塞作用,当Lock为一线程获取后,其他线程(包括其自身)若获取该锁,则线程阻止,不能往下运行,直到该锁释放。
- 若其他线程(包括自身)不获取该锁,则不发生阻塞作用,即阻塞作用发生在线程获取处于锁定状态的锁。
- 线程获取后的锁不一定必须释放,但若不释放,其他线程获取该锁时则发生死锁,程序假死。
互斥锁
两个线程使用同一个锁,只有一个线程运行结束后,另一个线程才能运行。
import threading
import time
total = 0
mutex = threading.Lock()
def sum_num(num):
mutex.acquire() #获取锁
for i in range(num):
global total
total += 1
print(f'{threading.current_thread()}sum num is: {total}.')
mutex.release() #释放锁
if __name__ == '__main__':
thread_list = []
for num in [1000000 for i in range(10)]:
multi_thread = threading.Thread(target=sum_num,args=(num,),)
multi_thread.start()
thread_list.append(multi_thread)
# 主线程等待子线程运行结束后运行打印
for t in thread_list:
t.join()
print('total is:', total)
示例
创建两个线程,其中一个线程输出1-52,另外一个输出A-Z,要求输出的格式如下:
12A 34B 56C ..... 5152Z
使用一个锁
import threading, time
def num():
for i in range(1,53,2):
lock.acquire()
print(str(i)+str(i+1), end='')
def alpha():
for i in range(65, 91):
time.sleep(0.000001)
print(chr(i))
lock.release()
if __name__ == '__main__':
lock = threading.Lock()
sn = threading.Thread(target=num)
sa = threading.Thread(target=alpha)
sn.start()
sa.start()
使用多个锁
import threading, time
alpha_lock = threading.Lock()
num_lock = threading.Lock()
def print_num():
num_lock.acquire() #先加锁,当输出2自己在获取锁时必须等待另一进程释放
for i in range(1, 53, 2):
print(str(i)+str(i + 1), end='')
num_lock.acquire()
alpha_lock.release()
def print_alpla():
for w in range(ord('A'), ord('Z') + 1,):
print(chr(w))
num_lock.release()
alpha_lock.acquire()
if __name__ == '__main__':
num_thread = threading.Thread(target=print_num,)
alpha_thread = threading.Thread(target=print_alpla)
alpha_lock.acquire()
num_thread.start()
alpha_thread.start()
重点是进程再次获取自己已经获取到的锁时必须等待另一进程释放
收获
- 遇到不懂的问题除了谷歌外,多看python文档,很可能是自己理解不到位。
转载于:https://my.oschina.net/u/4197529/blog/3098114
微信朋友圈年中数据报告在哪看 2018微信年终数据报告
微信年中数据报告近日在朋友圈中疯狂的刷屏当中,很多用户对此报告还是很关心的,那么微信年中数据报告怎么看在哪看?2018微信年终数据
excel中解二元一次方程的方法步骤
Excel中的二元一次方程具体该如何解决呢?下面是豌豆资源网小编带来的关于excel中解二元一次方程的方法,希望阅读过后对你有所启发!
一次修改上百个表格,Word中批量修改所有表格格式样式
我们在使用Word排版编写书籍时候,可能会带有许多表格,上百,甚至上千个表格都是有可能的。这么多的表格对于后期的样式修改是非常不利
【解决】当前操作环境不支持支付宝控件/一直处于“正
当前操作环境不支持支付宝控件 这种情况多发生在windows10的环境下,参考 解决办法! 这个问题解决了,可是太悲剧了,你的电脑可能又出现
[POI2008]BLO-Blockade
题目描述在Byteotia有n个城镇。 一些城镇之间由无向边连接。 在城镇外没有十字路口,尽管可能有桥,隧道或者高架公路(反正不考虑这些)
文章回顾
大家看了本文关于Threading中Lock的理解的精彩教程资源内容,是不是对关于Threading中Lock的理解了解更多,真心希望关于Threading中Lock的理解能帮助到你, 小编会一直给你带来更多教程资源文章信息。
本文由第三方用户分享仅代表作者观点,不代表本网站立场,秉承互联网开放分享的精神,目的在于传递更多信息,加强各行业互通交流,但对内容不作任何保证或承诺,请读者自行参考斟酌。网站发布的信息(包含但不限于版式、图片、字体、文章等素材)由第三方用户分享,版权归原作者所有,本站不承担任何相关的版权纠纷等相关责任。如您认为本篇内容侵犯了您的权益,请与我们联系,我们会及时处理。
豌豆资源网专注分享全网综合资源网站大全,致力于超实用的内容资源搜索。
转载请注明: 本文标题:关于Threading中Lock的理解 本文地址:https://www.55wd.com/s181855/