pyhton 线程锁
问题:已经有了全局解释器锁为什么还需要锁?
答:全局解释器锁是在Cpython解释器下,同一时刻,多个线程只能有一个线程被cpu调度
它是在线程和cpu之间加锁,线程和cpu之间有传递时间,即使有GIL,也无法保证数据的绝对安全
锁的分类
1、互斥锁
2、死锁
3、递归锁
# 虽然有全局解释器锁,数据仍然出现了安全问题
from threading import Thread
import time def test():
global n
temp = n
time.sleep(1)
n = temp - 1 n = 10
t_li = []
for i in range(5):
t = Thread(target=test)
t_li.append(t)
t.start()
[t.join() for t in t_li]
print(n) #
互斥锁
# 使用锁,解决了数据安全问题
from threading import Thread, Lock
import time def test(lock):
lock.acquire()
global n
temp = n
time.sleep(1)
n = temp - 1
lock.release() n = 10
lock = Lock()
t_li = []
for i in range(5):
t = Thread(target=test, args=(lock, ))
t_li.append(t)
t.start()
[t.join() for t in t_li]
print(n) #
死锁
# 科学家吃面
from threading import Lock
from threading import Thread
import time
noddle = Lock()
chopsticks = Lock() def test1(name):
noddle.acquire()
print('%s拿到面条' % name)
# time.sleep(2)
chopsticks.acquire()
print('%s拿到筷子' % name)
print('%s吃面' % name)
# time.sleep(1)
chopsticks.release()
noddle.release() def test2(name):
chopsticks.acquire()
print('%s拿到筷子' % name)
time.sleep(0.3)
noddle.acquire()
print('%s拿到面条' % name)
print('%s吃面' % name)
noddle.release()
chopsticks.release() t1 = Thread(target=test1, args=('tom', ))
t1.start()
t2 = Thread(target=test2, args=('abc', ))
t2.start() t3 = Thread(target=test1, args=('joker', ))
t3.start()
t4 = Thread(target=test2, args=('ff', ))
t4.start()
递归锁
# 递归锁,多个acquire()不会造成死锁
from threading import RLock
from threading import Thread
a = RLock() def test():
a.acquire()
a.acquire()
a.acquire()
print('hello, world') Thread(target=test).start()
# 科学家吃面 递归锁
from threading import RLock
from threading import Thread
import time
noddle = chopsticks = RLock() def test1(name):
noddle.acquire()
print('%s拿到面条' % name)
# time.sleep(2)
chopsticks.acquire()
print('%s拿到筷子' % name)
print('%s吃面' % name)
# time.sleep(1)
chopsticks.release()
noddle.release() def test2(name):
chopsticks.acquire()
print('%s拿到筷子' % name)
time.sleep(0.3)
noddle.acquire()
print('%s拿到面条' % name)
print('%s吃面' % name)
noddle.release()
chopsticks.release() t1 = Thread(target=test1, args=('tom', ))
t1.start()
t2 = Thread(target=test2, args=('abc', ))
t2.start()
t3 = Thread(target=test1, args=('joker', ))
t3.start()
t4 = Thread(target=test2, args=('ff', ))
t4.start()
pyhton 线程锁的更多相关文章
- NSLock线程锁的使用测试
测试1:NSLock线程锁是不是单例? 打印: 结论1:NSLock不是单例 测试2:同一个线程锁在不同的地方锁定,是否会有锁定两个? 打印为: 结论2:顺序打印,在不同的地方锁定也可以锁定. 测试3 ...
- day9---多线程,线程锁,队列
进程.线程 http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html 使用threading模块实现多线程编程[综述] Pyt ...
- python线程锁
import time,threading balance = 0 lock = threading.Lock() def change_it(n): global balance balance = ...
- linux下使用线程锁互斥访问资源
linux使用线程锁访问互斥资源: 1.线程锁的创建 pthread_mutex_t g_Mutex; 2.完整代码如下 #include <stdio.h> #include <s ...
- JAVA线程锁-读写锁
JAVA线程锁,除Lock的传统锁,又有两种特殊锁,叫读写锁ReadWriteLock 其中多个读锁不互斥,读锁和写锁互斥,写锁和写锁互斥 例子: /** * java线程锁分为读写锁 ReadWri ...
- Java线程锁一个简单Lock
/** * @author * * Lock 是java.util.concurrent.locks下提供的java线程锁,作用跟synchronized类似, * 单是比它更加面向对象,两个线程执行 ...
- python_way ,day11 线程,怎么写一个多线程?,队列,生产者消费者模型,线程锁,缓存(memcache,redis)
python11 1.多线程原理 2.怎么写一个多线程? 3.队列 4.生产者消费者模型 5.线程锁 6.缓存 memcache redis 多线程原理 def f1(arg) print(arg) ...
- Linux同步机制(一) - 线程锁
1 互斥锁 在线程实际运行过程中,我们经常需要多个线程保持同步. 这时可以用互斥锁来完成任务.互斥锁的使用过程中,主要有 pthread_mutex_init pthread_mutex_destor ...
- 单例模式——使用GCD实现单例模式 & 非ARC单例模式 &使用GCD和线程锁实现单例模式-b
1.单利模式概述 链接: iOS开发懒汉模式&恶寒模式 2.使用GCD实现单利模式 2.1新建一个project,然后新建一个HMDataTool类展示GCD实现单例模式 #import & ...
随机推荐
- 用Xshell连接谷歌云
谷歌云服务器,默认用浏览器进行SSH链接,而且也不告知密码.以Centos为例,先使用浏览器连接 1,给root修改密码 1 sudo passwd root 2,编辑ssh配置文件 sudo nan ...
- Spark in action Spark 以及SparkR的安装配置说明
Spark以及SparkR的安装(standalone模式) From :ssdutsu @ Inspur Company suzhiyuan2006@gmail.com 操作系统 CentOS 7 ...
- 备战省赛组队训练赛第十四场(UPC)
codeforces:传送门 upc:传送门 外来题解: [1]:https://blog.csdn.net/ccsu_cat/article/details/86707446 [2]:https:/ ...
- 清晰架构(Clean Architecture)的Go微服务: 设计原则
我最近写了一个Go微服务应用程序,这个程序的设计来自三个灵感: 清晰架构"Clean Architecture"¹ and SOLID (面向对象设计)² 设计 原则³ Sprin ...
- java中使用javaMail工具类发送邮件
1.引入依赖 <!--javaMail--> <dependency> <groupId>javax.mail</groupId> <artifa ...
- 洛谷p1345---最小割的奇妙运用
让你去掉最少的点,使得c1和c2变得不连通,你有办法吗??? 这是最小割呀!!! 网络流的最小割去掉的是边,构造边的顶点的唯一关系就好了!!! 需要注意一点 #include<iostream& ...
- JavaScript中浅拷贝和深拷贝的区别
JavaScript数据类型 基础数据类型:保存在栈内存中的简单数据段 ,有undefined,boolean,number,string,null 引用数据类型:Array,object,Funct ...
- 微信支付与支付宝支付java开发注意事项
说明:这里只涉及到微信支付和淘宝支付 以官网的接口为准,主要关注[网关].[接口].[参数][加密方式][签名][回调] 第一步,了解自己的项目要集成的支付方式 常见的有扫码支付.网页支付.APP支付 ...
- 【题解】幼儿园篮球题(范德蒙德卷积+斯特林+NTT)
[题解]幼儿园篮球题(NTT+范德蒙德卷积+斯特林数) 题目就是要我们求一个式子(听说叫做超几何分布?好牛逼的名字啊) \[ \sum_{i=1}^{S}\dfrac 1 {N \choose n_i ...
- JVM探秘:Java内存区域
本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. 概述 Java 虚拟机为程序员分担了很多内存管理的工作,不再像 C/C++ 那样容易出 ...