python多线程编程5: 条件变量同步
互斥锁是最简朴的线程同步机制,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 threading import time class Producer(threading.Thread): def run(self): global count while True: if con.acquire(): if count > 1000: con.wait() else: count = count+100 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, count='+str(count) print msg con.notify() con.release() time.sleep(1) count = 500 con = 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()