本篇文章给大家带来的内容是关于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中四种锁的使用示例(代码)相关推荐

  1. anaconda怎么运行python程序_Python中四种运行其他程序的方式,你知道吗?

    前言 在Python中,可以方便地使用os模块来运行其他脚本或者程序,这样就可以在脚本中直接使用其他脚本或程序提供的功能,而不必再次编写实现该功能的代码.为了更好地控制运行的进程,可以使用win32p ...

  2. java B锁_Java中15种锁的介绍

    原标题:Java中15种锁的介绍 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容如下: 1.公平锁 / 非公平锁 2.可重入锁 / 不可重入锁 3.独享 ...

  3. python中延时函数_python中实现延时回调普通函数示例代码

    python中实现延时回调普通函数示例代码 这篇文章主要给大家介绍了关于python中实现延时回调普通函数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的 ...

  4. python gil锁_python中的GIL锁

    熟悉python的都知道,在C语言写的python解释器中存在全局解释器锁,由于全局解释器锁的存在,在同一时间内,python解释器只能运行一个线程的代码,这大大影响了python多线程的性能.而这个 ...

  5. python中系列的含义_python中四种组合数据类型的含义、声明、增删改查,遍历

    一.列表 列表:list 可以存储多个有顺序的可以重复的数据的类型 其他语言:数据:python中~提供的是列表[不说数组] 列表:操作数据:增加.删除.修改.查询 [CRUD] append/ins ...

  6. python语言只有一种运行方式_Python中四种运行其他程序的方式

    在Python中,可以方便地使用os模块来运行其他脚本或者程序,这样就可以在脚本中直接使用其他脚本或程序提供的功能,而不必再次编写实现该功能的代码.为了更好地控制运行的进程,可以使用win32proc ...

  7. 浅谈Java中15种锁的分析比较

    作者:站长,来自:搜云库技术团队 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类,介绍的内容如下: 公平锁 / 非公平锁 可重入锁 / 不可重入锁 独享锁 / 共享 ...

  8. Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等...

    http://blog.51cto.com/13919357/2339446 Java 中15种锁的介绍 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容 ...

  9. Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等

    Java 中15种锁的介绍 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容如下: 公平锁 / 非公平锁 可重入锁 / 不可重入锁 独享锁 / 共享锁 互 ...

最新文章

  1. 【坐在马桶上看算法】排序总结:小哼买书
  2. php服务器监控windows,用Linux上的cacti去监控windows服务器(图)
  3. 绝佳时机,前所未遇,开创全新购物体验
  4. flink mysql connector_Flink JDBC Connector:Flink 与数据库集成最佳实践
  5. 都在抢论文第一作者,如何处理?
  6. 连接linux工具Mtr,mtr命令_Linux mtr命令使用详解:网络连通性判断工具
  7. mysql mysql的所有查询语句和聚合函数(整理一下,忘记了可以随时看看)
  8. MySQL高级show profile
  9. x79主板bios设置中文_bios菜单
  10. [C++11]对模板右尖括号的优化
  11. 产品经理和程序员之间的“潜台词”,你能听懂多少?
  12. 毫秒级预测,性能卓越!检测、跟踪、行为识别都搞定!这套行人分析系统重磅开源!...
  13. 5、ABPZero系列教程之拼多多卖家工具 修改User表结构
  14. Xamarin.Android开发实践(一)
  15. mysql转储表_Mysql导出表结构及表数据 mysqldump用法
  16. java设计模式之用王者荣耀打开观察者模式(附代码实例)每天一学设计模式
  17. 计算机文件图标怎么一致大小,电脑图标大小设置的几种方法
  18. 春节假期 | 最强抢票攻略
  19. 计算机的搜索功能无法启用,电脑文件搜索功能无法使用的具体解决方法
  20. mysql 支持中文的字符集_MySQL 中文显示乱码

热门文章

  1. linux运维转行程序员
  2. Hadoop官方文档翻译—— YARN ResourceManager High Availability 2.7.3
  3. 【三】傅里叶变换——1
  4. 北风网白帽子信息安全培训
  5. 正阅读微信小说分销系统-视频教程-6.生成推广文章-代理商必看-没有公众号也能推哦!
  6. 100DaysCSS-day4挑战
  7. 万商云集董事长王飞受邀出席“2018中国企业互联网CEO峰会”
  8. python制作网页挂机_一个用Python写的简易挂机锁
  9. div 中的控件底部对齐_css中怎么让div里面的文字底部对齐
  10. sizeof()大小总结