博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python锁
阅读量:5905 次
发布时间:2019-06-19

本文共 2262 字,大约阅读时间需要 7 分钟。

锁的概念是因为多线程而提出的,必须在线程中才能体现出锁的作用。

没用锁的情况:

import threadingimport timegl_num = 0def show(arg):    global gl_num    n = gl_num    time.sleep(1)    gl_num = n+1    print(gl_num)for i in range(10):    t = threading.Thread(target=show, args=(i,))    t.start()print ('main thread stop')
没用锁的代码
main thread stop1111111111
运行结果

可以看到,在没用锁的情况下,线程同时取到0并加1,结果都为1.

什么是锁?

  锁,跟门锁一样,他的作用不是为了锁定这个门,而是为了锁定门后的一方世界,也就是代码块。

  

import threadingimport timelock = threading.RLock()gl_num = 0def show(arg):    lock.acquire()    global gl_num    n = gl_num    time.sleep(1)    gl_num = n+1    lock.release()    print(gl_num)for i in range(10):    t = threading.Thread(target=show, args=(i,))    t.start()print ('main thread stop')
加上锁
main thread stop12345678910
结果

 

锁都有那些呢?

  两种:Lock(指令锁、RLock(可重入锁)。Lock属于全局,Rlock属于线程。

 

学习lock和Rlock区别前,我们要搞清楚什么事死锁。

死锁是:比如一辆车被两把锁锁住,你单单拿到一把锁的钥匙,你是开不了这个车的,这就是死锁。当然,这里是抽象的锁概念跟现实还有很大区别。

import threadingimport timelock = threading.Lock()gl_num = 0def show(arg):    lock.acquire()    print('我只执行一次就被锁住了。',threading.current_thread().name)    lock.acquire()    time.sleep(1)    print(threading.current_thread().name)    lock.release()    lock.release()for i in range(10):    t = threading.Thread(target=show, args=(i,))    t.start()print ('main thread stop')
死锁
我只执行一次就被锁住了。 Thread-1main thread stop
结果

那么这死锁怎么解决?呵呵,用Rlock,这因为就是他们的区别了。

import threadingimport timelock = threading.RLock()gl_num = 0def show(arg):    lock.acquire()    print('我只执行一次就被锁住了。',threading.current_thread().name)    lock.acquire()    time.sleep(1)    print(threading.current_thread().name)    lock.release()    lock.release()for i in range(10):    t = threading.Thread(target=show, args=(i,))    t.start()print ('main thread stop')
Rlock解决死锁,代码几乎不变
我只执行一次就被锁住了。 Thread-1main thread stopThread-1我只执行一次就被锁住了。 Thread-2Thread-2我只执行一次就被锁住了。 Thread-3Thread-3我只执行一次就被锁住了。 Thread-4Thread-4我只执行一次就被锁住了。 Thread-5Thread-5我只执行一次就被锁住了。 Thread-6Thread-6我只执行一次就被锁住了。 Thread-7Thread-7我只执行一次就被锁住了。 Thread-8Thread-8我只执行一次就被锁住了。 Thread-9Thread-9我只执行一次就被锁住了。 Thread-10Thread-10
结果

 总结

1、线程如果共用同一个数据(栈、队列),如果相互之间存在数据污染,那么就需要锁的来将操作公共数据的代码块锁起来。

2、锁的获取:lock = threading.Lock()或者lock = threading.RLock(),

3、lock跟RLock的区别,使用多把锁,那就需要Rlock来解决死锁问题。这里说的多把锁,是指一个锁多个嵌套。

 

转载于:https://www.cnblogs.com/hardykay/p/10203275.html

你可能感兴趣的文章
html video的url更新,自动清缓存
查看>>
【11】ajax请求后台接口数据与返回值处理js写法
查看>>
Python菜鸟之路:Jquery Ajax的使用
查看>>
LeetCode算法题-Maximum Depth of Binary Tree
查看>>
Cox 教学视频5
查看>>
Jenkins持续集成学习-搭建jenkins问题汇总
查看>>
使用ffmpeg实现对h264视频解码 -- (实现了一个易于使用的c++封装库)
查看>>
flink watermark介绍
查看>>
Android Xutils 框架
查看>>
Sysbench 0.5版安装配置
查看>>
书摘—你不可不知的心理策略
查看>>
【博客话题】毕业——开始人生的艰苦历程
查看>>
Linux安装telnet
查看>>
sap scriptfom 多语言翻译
查看>>
黄聪:3分钟学会sessionStorage用法
查看>>
Entity Framework 全面教程详解(转)
查看>>
Windows上Python2.7安装Scrapy过程
查看>>
Chapter 3:Code Style in Django
查看>>
挖掘数据金矿 领军协同创新 曙光荣膺“2016大数据创新应用领袖企业”称号
查看>>
Fast通道获得Win10 Mobile Build 14977更新
查看>>