python threading包

threading.Thread对象:有start()和run()方法。

threading.Lock对象:mutex, 有acquire(), release()方法。

threading.Condition对象:condition variable.有acquire(), release()方法。此外还有wait(), notify(), notifyAll()方法。

实例:

假设这样一个状况: 有100个工人,每人负责装修一个房间。当有10个房间装修完成的时候,老板就通知相应的十个工人一起去喝啤酒。我们如何实现呢?老板让工人在装修好房间之后,去检查已经装修好的房间数。但多线程条件下,会有竞争条件的危险。也就是说,其他工人有可能会在该工人装修好房子和检查之间完成工作。使用python解决。

#coding=utf8
'''
假设这样一个状况: 有100个工人,每人负责装修一个房间。当有10个房间装修完成的时候,老板就通知相应的十个工人一起去喝啤酒。
'''
import threading


num = 0
condition = threading.Condition()

def work(tid):
	global num
	global condition
	condition.acquire()
	
	num = num + 1
	if num <= 10:
		condition.wait()
		print("worker", tid,  "drink beer")
	elif num == 11:
		condition.notifyAll()
	
	condition.release()

for i in range(100):
	new_thread = threading.Thread(target = work, args = (i,))
	new_thread.start()

wait()做两件事情,一个是释放lock,从而让别的工人可以建房。另一个是等待,直到notifyAll()的通知。这样的话,符合条件的线程就开始等待。

当num等于11时,notifyAll()会通知之前等待的线程,该线程锁住lock,继续执行,直到condition.release()释放lock,接着另一个等待的线程执行。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值