天天看點

python使用condition實作一個簡易的栅欄,CyclicBarriar

'''
Created on 2017-1-11

@author: admin
'''
from threading import  Condition, Thread
class CyclicBarriar():
    def __init__(self,job,count):
        self.condition=Condition()
        self.job=job;
        self.count=count
    def await(self):
        self._doAwait()
    def _doAwait(self):
        try:
            self.condition.acquire()
            self.count-=1
            if self.count==0:
                if self.job!=None:
                    self.job.run()
                self.condition.notifyAll()
            else:
                self.condition.wait()    
        finally:
            self.condition.release()
    
if __name__ == '__main__':
    class SubThread(Thread):
        def __init__(self,name,barriar):
            Thread.__init__(self)
            self.name=name;
            self.barriar=barriar
        def run(self):
            print("finishing %s"%self.name)
            self.barriar.await()
    class MainThread(Thread):
        def __init__(self):
            Thread.__init__(self)
        def run(self):
            print("finishing main thread")
    
    barrair=CyclicBarriar(MainThread(),3)
    thread1=SubThread("thread one",barrair)
    thread2=SubThread("thread second",barrair)
    thread3=SubThread("thread third",barrair)
    thread1.start()
    thread2.start()
    thread3.start()