py并发_Barrier笔记

Barrier

Barrier表示的是一种屏障,当若干个进程没有达到屏障数量的时候都处于阻塞状态,一旦达到了屏障数量,那么将自动解除阻塞状态并且启动运行。

例如:现在假设说有一个特别行动的小组,该小组一共配备了12名特战队员,这些队员在执行任务的时候都要求按照每三个人自动成组的形式进行活动,如果说现在遇见了一些突发的情况,肯定要求12名组员各自形成自己的战斗小组,形成之后则立即开始行动(隐含条件:如果每一个小组的3人没有凑齐,那么其它的两名队员需要进行等待,一直到有3个人到位之后才可以正常开始行动),在这样的一个过程之中3人实际上就是一个屏障点,把每一位行动人员比喻为一个进程,那么就相当于

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# coding :UTF-8
import multiprocessing,time
def barrier_handle(): # 栅栏处理函数
print("当前战斗小组整装完毕,出发执行任务...")
def arrangement(barrier):
print("[%s]开始收拾行军准备..." % multiprocessing.current_process().name)
time.sleep(2) # 每一位队员2秒时间整理装备
barrier.wait() # 进入到一个屏障点儿等待
print("[%s]装备整理完毕和同组人员出发..." % multiprocessing.current_process().name)
def main(): # 主函数
barrier = multiprocessing.Barrier(parties=3,action=barrier_handle) # 每达到3个进程则调用处理函数
process_list = [multiprocessing.Process(
target=arrangement,args=(barrier,),name="士兵 - %s" % item)
for item in range(15) ]
for process in process_list:
process.start()
for process in process_list:
process.join()
barrier.abort() # 结束同步栅栏的锁定
if __name__ == "__main__":
main()

[士兵 - 0]开始收拾行军准备…
[士兵 - 2]开始收拾行军准备…
[士兵 - 1]开始收拾行军准备…
[士兵 - 4]开始收拾行军准备…
[士兵 - 5]开始收拾行军准备…
[士兵 - 3]开始收拾行军准备…
[士兵 - 6]开始收拾行军准备…
[士兵 - 8]开始收拾行军准备…
[士兵 - 7]开始收拾行军准备…
[士兵 - 9]开始收拾行军准备…
[士兵 - 10]开始收拾行军准备…
[士兵 - 11]开始收拾行军准备…
[士兵 - 13]开始收拾行军准备…
[士兵 - 12]开始收拾行军准备…
[士兵 - 14]开始收拾行军准备…
当前战斗小组整装完毕,出发执行任务…
[士兵 - 1]装备整理完毕和同组人员出发…
[士兵 - 0]装备整理完毕和同组人员出发…
[士兵 - 2]装备整理完毕和同组人员出发…
当前战斗小组整装完毕,出发执行任务…
[士兵 - 3]装备整理完毕和同组人员出发…
[士兵 - 4]装备整理完毕和同组人员出发…
[士兵 - 5]装备整理完毕和同组人员出发…
当前战斗小组整装完毕,出发执行任务…
[士兵 - 7]装备整理完毕和同组人员出发…
[士兵 - 6]装备整理完毕和同组人员出发…
[士兵 - 8]装备整理完毕和同组人员出发…
当前战斗小组整装完毕,出发执行任务…
[士兵 - 11]装备整理完毕和同组人员出发…
[士兵 - 9]装备整理完毕和同组人员出发…
[士兵 - 10]装备整理完毕和同组人员出发…
当前战斗小组整装完毕,出发执行任务…
[士兵 - 14]装备整理完毕和同组人员出发…
[士兵 - 13]装备整理完毕和同组人员出发…
[士兵 - 12]装备整理完毕和同组人员出发…

进程已结束,退出代码0

利用这种栅栏的操作可以控制多个进程的同时的并发执行处理,在进程数量不足的时候才会执行阻塞处理


py并发_Barrier笔记
https://blog.wangxk.cc/2020/02/01/py并发-Barrier笔记/
作者
Mike
发布于
2020年2月1日
许可协议