运动器材网站开发方案,失信被执行人名单查询系统,深圳市龙华区大浪街道,网站平台结构From: http://www.cnblogs.com/holbrook/archive/2012/03/13/2394811.html 互斥锁是最简单的线程同步机制#xff0c;Python提供的Condition对象提供了对复杂线程同步问题的支持。Condition被称为条件变量#xff0c;除了提供与Lock类似的acquire和release方法外#xff0c…From: http://www.cnblogs.com/holbrook/archive/2012/03/13/2394811.html 互斥锁是最简单的线程同步机制Python提供的Condition对象提供了对复杂线程同步问题的支持。Condition被称为条件变量除了提供与Lock类似的acquire和release方法外还提供了wait和notify方法。线程首先acquire一个条件变量然后判断一些条件。如果条件不满足则wait如果条件满足进行一些处理改变条件后通过notify方法通知其他线程其他处于wait状态的线程接到通知后会重新判断条件。不断的重复这一过程从而解决复杂的同步问题。
可以认为Condition对象维护了一个锁Lock/RLock)和一个waiting池。线程通过acquire获得Condition对象当调用wait方法时线程会释放Condition内部的锁并进入blocked状态同时在waiting池中记录这个线程。当调用notify方法时Condition对象会从waiting池中挑选一个线程通知其调用acquire方法尝试取到锁。
Condition对象的构造函数可以接受一个Lock/RLock对象作为参数如果没有指定则Condition对象会在内部自行创建一个RLock。
除了notify方法外Condition对象还提供了notifyAll方法可以通知waiting池中的所有线程尝试acquire内部锁。由于上述机制处于waiting状态的线程只能通过notify方法唤醒所以notifyAll的作用在于防止有线程永远处于沉默状态。
演示条件变量同步的经典问题是生产者与消费者问题假设有一群生产者(Producer)和一群消费者Consumer通过一个市场来交互产品。生产者的”策略“是如果市场上剩余的产品少于1000个那么就生产100个产品放到市场上而消费者的”策略“是如果市场上剩余产品的数量多余100个那么就消费3个产品。用Condition解决生产者与消费者问题的代码如下 import threadingimport timeclass Producer(threading.Thread): def run(self): global count while True: if con.acquire(): if count 1000: con.wait() else: count count100 msg self.name produce 100, count str(count) print msg con.notify() con.release() time.sleep(1)class Consumer(threading.Thread): def run(self): global count while True: if con.acquire(): if count 100: con.wait() else: count count-3 msg self.name consume 3, countstr(count) print msg con.notify() con.release() time.sleep(1)count 500con threading.Condition()def test(): for i in range(2): p Producer() p.start() for i in range(5): c Consumer() c.start()if __name__ __main__: test()