Barrier(parties, action=None, timeout=None)

每个线程通过调用wait()尝试通过障碍,并阻塞,直到阻塞的数量达到parties时,阻塞的线程被同时全部释放。

action是一个可调用对象,当线程被释放时,其中一个线程会首先调用action,之后再跑自己的代码。

timeout时默认的超时时间。

方法:

wait(timeout=None)

尝试通过障碍并阻塞。

返回值是一个在0parties-1范围内的整数,每个线程都不同。

其中一个线程在释放之前将调用action。如果此调用引发错误,则障碍将进入断开状态。

如果等待超时,障碍也将进入断开状态。

如果在线程等待期间障碍断开重置,此方法可能会引发BrokenBarrierError错误。

reset()

重置障碍,返回默认的空状态,即当前阻塞的线程重新来过。见例二

abort()

将障碍置为断开状态,这将导致已调用wait()或之后调用wait()引发BrokenBarrierError。见例三

属性:

partier

通过障碍所需的线程数。

n_waiting

当前在屏障中等待的线程数

broken

如果屏障处于断开状态,则返回True

实例

例一:

# -*- coding:utf-8 -*-
import threading
import time def open():
print('人数够了, 开门!') barrier = threading.Barrier(3, open) class Customer(threading.Thread):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.n = 3 def run(self):
while self.n > 0:
self.n -= 1
print('{0}在等着开门.'.format(self.name))
try:
barrier.wait(2)
except threading.BrokenBarrierError:
pass
print('开门了, go go go') if __name__ == '__main__':
t1 = Customer(name='A')
t2 = Customer(name='B')
t3 = Customer(name='C')
t1.start()
t2.start()
t3.start()

运行结果:

A在等着开门.
B在等着开门.
C在等着开门.
人数够了, 开门!
开门了, go go go
开门了, go go go
开门了, go go go
C在等着开门.
A在等着开门.
B在等着开门.
人数够了, 开门!
开门了, go go go
开门了, go go go
开门了, go go go
...

例二:

# -*- coding:utf-8 -*-
import threading
import time def open():
print('人数够了, 开门!') barrier = threading.Barrier(3, open) class Customer(threading.Thread):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.n = 3 def run(self):
while self.n > 0:
self.n -= 1
print('{0}在等着开门.'.format(self.name))
try:
barrier.wait(2)
except threading.BrokenBarrierError:
continue
print('开门了, go go go') class Manager(threading.Thread):
def run(self):
print('前面几个排队的不算,重新来')
barrier.reset() if __name__ == '__main__':
t1 = Customer(name='A')
t2 = Customer(name='B')
t3 = Customer(name='C')
tm = Manager()
t1.start()
t2.start()
tm.start()
t3.start()

运行结果:

A在等着开门.
B在等着开门.
前面几个排队的不算,重新来
A在等着开门.
B在等着开门.
C在等着开门.
人数够了, 开门!
开门了, go go go
开门了, go go go
开门了, go go go
A在等着开门.
C在等着开门.
B在等着开门.
人数够了, 开门!
开门了, go go go
开门了, go go go
开门了, go go go
C在等着开门.

例三:

# -*- coding:utf-8 -*-
import threading def open():
print('人数够了, 开门!') barrier = threading.Barrier(3, open) class Customer(threading.Thread):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.n = 3 def run(self):
while self.n > 0:
self.n -= 1
print('{0}在等着开门.'.format(self.name))
try:
barrier.wait(2)
except threading.BrokenBarrierError:
print('今天好像不开门了,回家.')
break
print('开门了, go go go') class Manager(threading.Thread):
def run(self):
print('老板跟小姨子跑了,不开门了!')
barrier.reset() if __name__ == '__main__':
t1 = Customer(name='A')
t2 = Customer(name='B')
t3 = Customer(name='C')
tm = Manager()
t1.start()
t2.start()
tm.start()
t3.start()

运行结果:

A在等着开门.
B在等着开门.
老板跟小姨子跑了,不开门了!
今天好像不开门了,回家.
今天好像不开门了,回家.
C在等着开门.
今天好像不开门了,回家.

Python多线程-Barrier(障碍对象)的更多相关文章

  1. [Python 多线程] Barrier (十一)

    Barrier 栅栏,也叫屏障.可以想象成路障.道闸. Python 3.2引入的新功能. 构造方法: threading.Barrier(parties, action=None, timeout= ...

  2. Python多线程-Event(事件对象)

    Event 事件对象管理一个内部标志,通过set()方法将其设置为True,并使用clear()方法将其设置为False.wait()方法阻塞,直到标志为True.该标志初始为False. 方法: i ...

  3. python多线程-Semaphore(信号对象)

    Semaphore(value=1) Semaphore对象内部管理一个计数器,该计数器由每个acquire()调用递减,并由每个release()调用递增.计数器永远不会低于零,当acquire() ...

  4. python多线程--Condition(条件对象)

    Condition class threading.Condition(lock=None 这个类实现条件变量对象.条件变量允许一个或多个线程等待,知道它们被另一个线程唤醒. 如果给出了lock参数而 ...

  5. python线程障碍对象Barrier(34)

    python线程Barrier俗称障碍对象,也称栅栏,也叫屏障. 一.线程障碍对象Barrier简介 # 导入线程模块 import threading # 障碍对象barrier barrier = ...

  6. Python多线程 - threading

    目录 1. GIL 2. API 3. 创建子线程 4. 线程同步 4.1. 有了GIL,是否还需要同步? 4.1.1. 死锁 4.1.2. 竞争条件 4.1.3. GIL去哪儿了 4.2. Lock ...

  7. python多线程与threading模块

    python多线程与_thread模块 中介绍了线程的基本概念以及_thread模块的简单示例.然而,_thread模块过于简单,使得我们无法用它来准确地控制线程,本文介绍threading模块,它提 ...

  8. 搞定python多线程和多进程

    1 概念梳理: 1.1 线程 1.1.1 什么是线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发 ...

  9. 浅析Python多线程

    学习Python多线程的资料很多,吐槽Python多线程的博客也不少.本文主要介绍Python多线程实际应用,且假设读者已经了解多线程的基本概念.如果读者对进程线程概念不甚了解,可参见知名博主 阮一峰 ...

随机推荐

  1. 新加了一块硬盘,在bios中可以看的到,在系统的磁盘管理器中看不到新加硬盘

    今天新加了一块硬盘,进入bios中可以看到新加的硬盘,但是进入系统后在磁盘管理及磁盘驱动器中都看不到.并且在设备管理器下其他设备出现了ATA channel1,前面显示感叹号,如下图所示: 而且电脑变 ...

  2. new命令简化的内部流程

    构造函数返回对象的一些问题: function fn(name,age){ this.name = name; this.age = age; //return 23; 忽略数字,直接返回原有对象 / ...

  3. highChart图表

    Highcharts 是一个用纯JavaScript编写的一个图表库, 能够很简单便捷的在web网站或是web应用程序添加有交互性的图表,并且免费提供给个人学习.个人网站和非商业用途使用.HighCh ...

  4. canvas制作表盘

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  5. weat!!团队

    摘要: 团队名称:weat!! 团队成员:刘波 崔和杰 简介: 刘波:性别男,爱好:动漫,徒步旅行.在组内负责程序编写这一部分. 优点:认真负责,不懂就会去问. 崔和杰:性别男,爱好:篮球.在组内负责 ...

  6. (spfa) Highway Project (zoj 3946 )

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5718   Highway Project Time Limit: 2 Seco ...

  7. Tarjan求缩点化强连通图

    Describe: 求一个有向图加多少条边可以变成一个强连通图 Solution: Tarjan缩点染色后,判断出度和入度,所有点的出度 = 0 的和 和 入度 = 0 的和的最大值即为所求. 缩点染 ...

  8. sed,grep,进阶+source+export+环境变量

    三剑客之sed 概括流程:从文件或管道中,可迭代读取. 命令格式: sed(软件) 选项 sed命令 输入文件 增 两个sed命令: a: 追加文本到指定行后 i: 插入到指定行前 sed -i '1 ...

  9. 5.Django高级

    管理静态文件 项目中的CSS.图片.js都是静态文件 配置静态文件 在settings 文件中定义静态内容 STATIC_URL = '/static/' STATICFILES_DIRS = [ o ...

  10. java 异步机制与同步机制的区别

    所谓异步输入输出机制,是指在进行输入输出处理时,不必等到输入输出处理完毕才返回.所以异步的同义语是非阻塞(None Blocking). 网上有很多网友用很通俗的比喻  把同步和异步讲解的很透彻 转过 ...