1

我使用Barriers在Python3中實現了此代碼。我想在Python2.7相同的功能,但我不知道用哪個同步原語的障礙是不是有在Python2.7在Python2.7中實現屏障

import threading 
import time 
from threading import Thread,Barrier 

b = Barrier(2, timeout=50) 

def func1(): 
    time.sleep(3) 
    b.wait() 
    print('Working from func1') 
    return 

def func2(): 
    time.sleep(5) 
    b.wait() 
    print('Working from func2') 
    return 

if __name__ == '__main__': 
    Thread(target = func1).start() 
    Thread(target = func2).start() 

回答

3

您可以模擬信號量的屏障。 看看: Implementing an N process barrier using semaphores

的問題是,它沒有超時參數,也許使用條件......

import time 
from threading import Thread,Semaphore 

class Barrier: 
    def __init__(self, n): 
     self.n = n 
     self.count = 0 
     self.mutex = Semaphore(1) 
     self.barrier = Semaphore(0) 

    def wait(self): 
     self.mutex.acquire() 
     self.count = self.count + 1 
     self.mutex.release() 
     if self.count == self.n: self.barrier.release() 
     self.barrier.acquire() 
     self.barrier.release() 

b = Barrier(2) 

def func1(): 
    time.sleep(3) 
    # 
    b.wait() 
    # 
    print('Working from func1') 
    return 

def func2(): 
    time.sleep(5) 
    # 
    b.wait() 
    # 
    print('Working from func2') 
    return  

if __name__ == '__main__': 
    Thread(target = func1).start() 
    Thread(target = func2).start()