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解决。
wait()做两件事情,一个是释放lock,从而让别的工人可以建房。另一个是等待,直到notifyAll()的通知。这样的话,符合条件的线程就开始等待。
当num等于11时,notifyAll()会通知之前等待的线程,该线程锁住lock,继续执行,直到condition.release()释放lock,接着另一个等待的线程执行。
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,接着另一个等待的线程执行。
相关文章推荐
- 使用python的Flask实现一个RESTful API服务器端[翻译]
- python-re模块
- Python深入:编码问题总结
- python编码笔记
- Python 文件处理的几点注意事项
- python对运行程序进行日志文件记录
- Python字符串
- python循环语句
- python 安装扩展库
- Python的open函数
- Python中的random库
- KNN算法学习--python实现和java实现
- python不用正则过渡括号
- Python 数据处理,切片,替换,去重,排序
- Python 数据处理,切片,替换,去重,排序
- Python中的类(上)
- python中的上下文管理器
- python-eggs异常解决方法
- python的嵌套列表推导
- python学习之路-书籍推荐