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. 委托构造函数(c++11)

    1.概念 1)委托构造函数也是构造函数,它也有形参列表,它将实参传递给其他的构造函数来初始化类对象,像是把自己的一些(或者全部)构造职责委托给其他构造函数一样

  2. MFC单文档带窗体创建

    我用的vs05.先随便起个名字qwerty. 确定以后在左边最下面有一个生成的类,点击生成的类,把基类改成CFormView 最后点击完成就创建好了. 单文档的窗口不是后来创建后插入的,是在创建后就自 ...

  3. mysql 查询中文字段 没有结果的解决方法

    代码如下: $conn = new mysqli('localhost', 'root', '', 'excel');$sql = "select 中信一级行业 from excel gro ...

  4. 微信 公众号平台 与 开放平台 获取用户信息 scope snsapi_login

    微信公众号(公众平台) 和 微信开放平台 是两码事.公众号(公众平台)获取的scope只包括两种:snsapi_base 和snsapi_userinfo,前者是静默获取,用户无感知:后者是需要用户确 ...

  5. 简单MVC实现增删改查

    反射工具类RelfectionUtils package Utils; import java.lang.reflect.Field; import java.lang.reflect.Invocat ...

  6. 2.3.5使用原子类进行i++操作

    除了在i++操作时使用synchronized关键字实现同步外,还可以使用AtomicInteger原子类进行实现 原子操作时不可分割的整体,没有其他线程能够中断或检查正在原子操作的变量,一个原子类型 ...

  7. 批量插入,批量修改的sql

    sql 1  批量插入 <insert id="batchInsert" useGeneratedKeys="true" parameterType=&q ...

  8. Leetcode--136. Single Number(easy)

    Given a non-empty array of integers, every element appears twice except for one. Find that single on ...

  9. 《it项目管理那些事》学习笔记

    此书适合:计算及相关专业的学生,想成为测试工程师.软件工程师.进入项目经理的人,或者经验丰富的it经理人. 之所以称为学习笔记,是加上我从百度搜到一些在看书过程中不明白的it语,作为菜鸟的我,得多看看 ...

  10. hdu 2688

    这题,因为要统计之前有多少个数比当前的数小,所以我用的树状数组 基本代码就是这样,还是比较好想的,只不过我没想出来罢了 #include <iostream> #include <c ...