首页 > 代码库 > PYTHON线程知识再研习E---条件变量同步Condition

PYTHON线程知识再研习E---条件变量同步Condition

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的作用在于防止有线程永远处于沉默状态。

#!/usr/bin/env python# -*- coding: utf-8 -*-import threadingimport timeclass Producer(threading.Thread):    def run(self):        global count        while True:            if con.acquire():                if count > 1000:                    con.wait()                else:                    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 -= 3                    msg = self.name +  consume 3, count =  + str(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()

 

PYTHON线程知识再研习E---条件变量同步Condition