您的位置:首页 > 编程语言 > Python开发

python threading包

2015-07-26 16:36 567 查看
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,接着另一个等待的线程执行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: