注意:Barrier是py3才有。
Barrier:表示的是一种屏障,当若干个进程没有达到屏障数量的是会都处于阻塞的状态之下,如果一旦达到的了限定的屏障数的时候,那么会自动的解除状态且自动的启动运行。
Barrier的语义理解就是: 每个任务按规定的分组数进行任务执行,如果没有达到规定的分组数,则需要一直阻塞等待满足规定的分数组(屏障点)才会可以执行任务。
创建对象:Barrier(parties, action=None, timeout=None)
方法:
wait(timeout=None) 尝试通过障碍并阻塞。
返回值是一个在0到parties-1范围内的整数,每个线程都不同。 其中一个线程在释放之前将调用action。如果此调用引发错误,则障碍将进入断开状态。
reset() 重置障碍,返回默认的空状态,即当前阻塞的线程重新来过。见例二
abort() 将障碍置为断开状态,这将导致已调用wait()或之后调用wait()引发BrokenBarrierError。
import time
import threading
def barrier_action():
print('组队完成!')
def tacks_action(barrier):
print("【%s】进入开始执行任务前的准备"%(threading.current_thread().name))
time.sleep(3)
barrier.wait() # 进入到一个屏障点等待
print("【%s】准备完成!---正式执行任务" % (threading.current_thread().name))
if __name__ == '__main__':
time1 = time.time()
barrier = threading.Barrier(3, action=barrier_action, timeout=None)# 需三个人一组,每满三人则调用barrier_action
# barrier = Barrier(parties=3,action=barrier_action)
pslist = [threading.Thread(name="队员编号:%s"%(i),target=tacks_action,args=(barrier,)) for i in range(9) ]
for ps in pslist:
ps.start()
for ps in pslist:
ps.join()
# 结束同步蓝山的锁定
# 将障碍置为断开状态,这将导致已调用wait()或之后调用wait()引发brokenbarriererror
barrier.abort()
time2 = time.time()
print("计算用时:", time2-time1)
输出结果:
【队员编号:0】进入开始执行任务前的准备
【队员编号:1】进入开始执行任务前的准备
【队员编号:2】进入开始执行任务前的准备
【队员编号:3】进入开始执行任务前的准备
【队员编号:4】进入开始执行任务前的准备
【队员编号:5】进入开始执行任务前的准备
【队员编号:6】进入开始执行任务前的准备
【队员编号:7】进入开始执行任务前的准备
【队员编号:8】进入开始执行任务前的准备
组队完成!
【队员编号:5】准备完成!---正式执行任务
【队员编号:8】准备完成!---正式执行任务【队员编号:7】准备完成!---正式执行任务
组队完成!
【队员编号:3】准备完成!---正式执行任务
【队员编号:2】准备完成!---正式执行任务【队员编号:1】准备完成!---正式执行任务
组队完成!
【队员编号:4】准备完成!---正式执行任务【队员编号:6】准备完成!---正式执行任务【队员编号:0】准备完成!---正式执行任务
计算用时: 3.0160064697265625
个人其他博客地址
简书:https://www.jianshu.com/u/d6960089b087
掘金:https://juejin.cn/user/2963939079225608
小钟同学 | 文 【原创】| QQ:308711822
1:本文相关描述主要是个人的认知和见解,如有不当之处,还望各位大佬指正。 2:关于文章内容,有部分内容参考自互联网整理,如有链接会声明标注;如没有及时标注备注的链接的,如有侵权请联系,我会立即删除处理哟。
原文作者:程序员小钟同学;如有侵权,请联系管理员删除。