Barrier常用来实现这样的线程同步,多个线程运行到某个时间点以后每个线程都需要等着其他线程都准备好以后再同时进行下一步工作。类似于赛马时需要先用栅栏拦住,每个试图穿过栅栏的选手都需要明确说明自己准备好了,当所有选手都表示准备好以后,栅栏打开,所有选手同时冲出栅栏。
下面的代码创建了一个允许3个线程互相等待的Barrier对象,每个线程做完一些准备工作后调用Barrier对象的wait()方法等待其他线程,当所有线程都调用了wait()方法之后,会调用指定的action对象,然后同时开始执行wait()之后的代码。
import threading
import random
import time
def worker(arg):
#假设每个线程需要不同的时间来完成准备工作
time.sleep(random.randint(1, 20))
#假设已知任何线程的准备工作最多需要20秒
#每个线程调用wait()时,返回值不一样
r = b.wait(20)
if r==0:
print(arg)
def printOk():
print('ok')
#允许3个线程等待
#如果线程调用wait()时没有指定超时时间,默认为20秒
b = threading.Barrier(parties=3, action=printOk, timeout=20)
#创建并启动3个线程
#线程数量必须与Barrier对象的parties一致
for i in range(3):
t = threading.Thread(target=worker, args=(i,))
t.start()