ITPub博客

首页 > 数据库 > 数据库开发技术 > python 多线程同步问题:障碍对象Barrier初步了解

python 多线程同步问题:障碍对象Barrier初步了解

原创 数据库开发技术 作者:程序员小钟同学 时间:2021-05-25 17:30:09 0 删除 编辑

通俗说法:

  • 组队打怪
  • 有挂了的队员,后备队员替补

Barrier

  • 俗称障碍对象,也称栅栏,也叫屏障。
  • 和进程中的Barrier一样

注意:Barrier是py3才有。

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

Barrier的语义理解就是: 每个任务按规定的分组数进行任务执行,如果没有达到规定的分组数,则需要一直阻塞等待满足规定的分数组(屏障点)才会可以执行任务。

Barrier创建

创建对象:Barrier(parties, action=None, timeout=None)

  • action是一个可调用对象,当线程或进程被释放时,其中一个线程或进程会首先调用action,之后再执行自己的代码。
  • timeout时默认的超时时间。

几个方式说明:

方法:

  • wait(timeout=None) 尝试通过障碍并阻塞。

    返回值是一个在0到parties-1范围内的整数,每个线程都不同。 其中一个线程在释放之前将调用action。如果此调用引发错误,则障碍将进入断开状态。

    • 如果等待超时,障碍也将进入断开状态。
    • 如果在线程等待期间障碍断开或重置,此方法可能会引发BrokenBarrierError错误。
  • 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:关于文章内容,有部分内容参考自互联网整理,如有链接会声明标注;如没有及时标注备注的链接的,如有侵权请联系,我会立即删除处理哟。


原文作者:程序员小钟同学;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2021-02-20

  • 博文量
    224
  • 访问量
    111711