python锁_Python中四种锁的使用示例(代码)
本篇文章给大家带来的内容是关于Python中四种锁的使用示例(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
Lock互斥锁
使用前num = 0
def a():
global num
for _ in range(10000000):
num += 1
def b():
global num
for _ in range(10000000):
num += 1
if __name__ == '__main__':
t1=Thread(target=a)
t1.start()
t2=Thread(target=b)
t2.start()
t1.join()
t2.join()
print(num) #基本永远会小于20000000
使用后num = 0
def a(lock):
global num
for _ in range(1000000):
with lock:
num += 1
def b(lock):
global num
for _ in range(1000000):
with lock:
num += 1
if __name__ == '__main__':
lock = threading.Lock()
t1=Thread(target=a, args=(lock,))
t1.start()
t2=Thread(target=b, args=(lock,))
t2.start()
t1.join()
t2.join()
print(num) #永远会输出20000000
RLock重用锁#在之前的代码中永远不可能出现锁在没释放之前重新获得锁,但rlock可以做到,但只能发生在一个线程中,如:
num = 0
def a(lock):
with lock:
print("我是A")
b(lock)
def b(lock):
with lock:
print("我是b")
if __name__ == '__main__':
lock = threading.Lock()
t1 = Thread(target=a, args=(lock,))
t1.start() #会发生死锁,因为在第一次还没释放锁后,b就准备上锁,并阻止a释放锁
使用后if __name__ == '__main__':
lock = threading.RLock() #只需要改变锁为RLock程序马上恢复
t1 = Thread(target=a, args=(lock,))
t1.start()
Condition同步锁#这个程序我们模拟甲乙对话
Jlist = ["在吗", "干啥呢", "去玩儿不", "好吧"]
Ylist = ["在呀", "玩儿手机", "不去"]
def J(list):
for i in list:
print(i)
time.sleep(0.1)
def Y(list):
for i in list:
print(i)
time.sleep(0.1)
if __name__ == '__main__':
t1 = Thread(target=J, args=(Jlist,))
t1.start()
t1.join()
t2 = Thread(target=Y, args=(Ylist,))
t2.start()
t2.join() #上面的程序输出后发现效果就是咱们想要的,但是我们每次输出后都要等待0.1秒,也无法正好确定可以拿到时间片的最短时间值,并且不能保证每次正好都是另一个线程执行。因此,我们用以下方式,完美解决这些问题。
使用后Jlist = ["在吗", "干啥呢", "去玩儿不", "好吧"]
Ylist = ["在呀", "玩儿手机", "不去","哦"]
def J(cond, list):
for i in list:
with cond:
print(i)
cond.notify()
cond.wait()
def Y(cond, list):
for i in list:
with cond:
cond.wait()
print(i)
cond.notify()
if __name__ == '__main__':
cond = threading.Condition()
t1 = Thread(target=J, args=(cond, Jlist))
t2 = Thread(target=Y, args=(cond, Ylist))
t2.start()
t1.start() #一定保证t1启动在t2之后,因为notify发送的信号要被t2接受到,如果t1先启动,会发生阻塞。
Seamplore信号量
使用前class B(threading.Thread):
def __init__(self, name):
super().__init__()
self.name = name
def run(self):
time.sleep(1)
print(self.name)
class A(threading.Thread):
def __init__(self):
super().__init__()
def run(self):
for i in range(100):
b = B(i)
b.start()
if __name__ == '__main__':
a = A()
a.start() #执行后发现不断在输出
使用后class B(threading.Thread):
def __init__(self, name, sem):
super().__init__()
self.name = name
self.sem = sem
def run(self):
time.sleep(1)
print(self.name)
sem.release()
class A(threading.Thread):
def __init__(self, sem):
super().__init__()
self.sem = sem
def run(self):
for i in range(100):
self.sem.acquire()
b = B(i, self.sem)
b.start()
if __name__ == '__main__':
sem = threading.Semaphore(value=3)
a = A(sem)
a.start() #通过执行上面的代码,我们发现一次只能输出三个数字,sem控制访问并发量
python锁_Python中四种锁的使用示例(代码)相关推荐
- anaconda怎么运行python程序_Python中四种运行其他程序的方式,你知道吗?
前言 在Python中,可以方便地使用os模块来运行其他脚本或者程序,这样就可以在脚本中直接使用其他脚本或程序提供的功能,而不必再次编写实现该功能的代码.为了更好地控制运行的进程,可以使用win32p ...
- java B锁_Java中15种锁的介绍
原标题:Java中15种锁的介绍 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容如下: 1.公平锁 / 非公平锁 2.可重入锁 / 不可重入锁 3.独享 ...
- python中延时函数_python中实现延时回调普通函数示例代码
python中实现延时回调普通函数示例代码 这篇文章主要给大家介绍了关于python中实现延时回调普通函数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的 ...
- python gil锁_python中的GIL锁
熟悉python的都知道,在C语言写的python解释器中存在全局解释器锁,由于全局解释器锁的存在,在同一时间内,python解释器只能运行一个线程的代码,这大大影响了python多线程的性能.而这个 ...
- python中系列的含义_python中四种组合数据类型的含义、声明、增删改查,遍历
一.列表 列表:list 可以存储多个有顺序的可以重复的数据的类型 其他语言:数据:python中~提供的是列表[不说数组] 列表:操作数据:增加.删除.修改.查询 [CRUD] append/ins ...
- python语言只有一种运行方式_Python中四种运行其他程序的方式
在Python中,可以方便地使用os模块来运行其他脚本或者程序,这样就可以在脚本中直接使用其他脚本或程序提供的功能,而不必再次编写实现该功能的代码.为了更好地控制运行的进程,可以使用win32proc ...
- 浅谈Java中15种锁的分析比较
作者:站长,来自:搜云库技术团队 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类,介绍的内容如下: 公平锁 / 非公平锁 可重入锁 / 不可重入锁 独享锁 / 共享 ...
- Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等...
http://blog.51cto.com/13919357/2339446 Java 中15种锁的介绍 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容 ...
- Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等
Java 中15种锁的介绍 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容如下: 公平锁 / 非公平锁 可重入锁 / 不可重入锁 独享锁 / 共享锁 互 ...
最新文章
- 【坐在马桶上看算法】排序总结:小哼买书
- php服务器监控windows,用Linux上的cacti去监控windows服务器(图)
- 绝佳时机,前所未遇,开创全新购物体验
- flink mysql connector_Flink JDBC Connector:Flink 与数据库集成最佳实践
- 都在抢论文第一作者,如何处理?
- 连接linux工具Mtr,mtr命令_Linux mtr命令使用详解:网络连通性判断工具
- mysql mysql的所有查询语句和聚合函数(整理一下,忘记了可以随时看看)
- MySQL高级show profile
- x79主板bios设置中文_bios菜单
- [C++11]对模板右尖括号的优化
- 产品经理和程序员之间的“潜台词”,你能听懂多少?
- 毫秒级预测,性能卓越!检测、跟踪、行为识别都搞定!这套行人分析系统重磅开源!...
- 5、ABPZero系列教程之拼多多卖家工具 修改User表结构
- Xamarin.Android开发实践(一)
- mysql转储表_Mysql导出表结构及表数据 mysqldump用法
- java设计模式之用王者荣耀打开观察者模式(附代码实例)每天一学设计模式
- 计算机文件图标怎么一致大小,电脑图标大小设置的几种方法
- 春节假期 | 最强抢票攻略
- 计算机的搜索功能无法启用,电脑文件搜索功能无法使用的具体解决方法
- mysql 支持中文的字符集_MySQL 中文显示乱码
热门文章
- linux运维转行程序员
- Hadoop官方文档翻译—— YARN ResourceManager High Availability 2.7.3
- 【三】傅里叶变换——1
- 北风网白帽子信息安全培训
- 正阅读微信小说分销系统-视频教程-6.生成推广文章-代理商必看-没有公众号也能推哦!
- 100DaysCSS-day4挑战
- 万商云集董事长王飞受邀出席“2018中国企业互联网CEO峰会”
- python制作网页挂机_一个用Python写的简易挂机锁
- div 中的控件底部对齐_css中怎么让div里面的文字底部对齐
- sizeof()大小总结