Python多线程-Barrier(障碍对象)
Barrier(parties, action=None, timeout=None)
每个线程通过调用wait()
尝试通过障碍,并阻塞,直到阻塞的数量达到parties
时,阻塞的线程被同时全部释放。
action
是一个可调用对象,当线程被释放时,其中一个线程会首先调用action
,之后再跑自己的代码。
timeout
时默认的超时时间。
方法:
wait(timeout=None)
尝试通过障碍并阻塞。
返回值是一个在0
到parties-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(障碍对象)的更多相关文章
- [Python 多线程] Barrier (十一)
Barrier 栅栏,也叫屏障.可以想象成路障.道闸. Python 3.2引入的新功能. 构造方法: threading.Barrier(parties, action=None, timeout= ...
- Python多线程-Event(事件对象)
Event 事件对象管理一个内部标志,通过set()方法将其设置为True,并使用clear()方法将其设置为False.wait()方法阻塞,直到标志为True.该标志初始为False. 方法: i ...
- python多线程-Semaphore(信号对象)
Semaphore(value=1) Semaphore对象内部管理一个计数器,该计数器由每个acquire()调用递减,并由每个release()调用递增.计数器永远不会低于零,当acquire() ...
- python多线程--Condition(条件对象)
Condition class threading.Condition(lock=None 这个类实现条件变量对象.条件变量允许一个或多个线程等待,知道它们被另一个线程唤醒. 如果给出了lock参数而 ...
- python线程障碍对象Barrier(34)
python线程Barrier俗称障碍对象,也称栅栏,也叫屏障. 一.线程障碍对象Barrier简介 # 导入线程模块 import threading # 障碍对象barrier barrier = ...
- Python多线程 - threading
目录 1. GIL 2. API 3. 创建子线程 4. 线程同步 4.1. 有了GIL,是否还需要同步? 4.1.1. 死锁 4.1.2. 竞争条件 4.1.3. GIL去哪儿了 4.2. Lock ...
- python多线程与threading模块
python多线程与_thread模块 中介绍了线程的基本概念以及_thread模块的简单示例.然而,_thread模块过于简单,使得我们无法用它来准确地控制线程,本文介绍threading模块,它提 ...
- 搞定python多线程和多进程
1 概念梳理: 1.1 线程 1.1.1 什么是线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发 ...
- 浅析Python多线程
学习Python多线程的资料很多,吐槽Python多线程的博客也不少.本文主要介绍Python多线程实际应用,且假设读者已经了解多线程的基本概念.如果读者对进程线程概念不甚了解,可参见知名博主 阮一峰 ...
随机推荐
- Vsftpd完全攻略(三)基于系统用户支持ftp上传 访问和vsftp安全设置
原文链接:http://viong.blog.51cto.com/844766/261342 1.关闭匿名用户登录 ftp支持匿名登录是不安全,所以要禁止匿名ftp登录 在/etc/vsftpd/vs ...
- Mustache应用——渲染二级菜单
一.菜单的样式 如上图所示,菜单一共两级.一级菜单的父结点都为0,二级菜单的父结点是前结点的code. code:为每一个结点独一无二的标识,也可以认为是ID. 二.菜单的数据结构 编写菜单的结构,采 ...
- (转).net面试题(老赵)
转自:http://www.cnblogs.com/chenxiaoran/archive/2012/05/27/2519988.html 1.什么是CLR 公共语言运行时(Comman langua ...
- IOS绘图详解
http://blog.163.com/wkyuyang_001/blog/static/10802122820133190545227/
- pycharm的注册码,所有版本
77751S0VBA-eyJsaWNlbnNlSWQiOiI3Nzc1MVMwVkJBIiwibGljZW5zZWVOYW1lIjoi5b285bK4IHNvZnR3YXJlMiIsImFzc2lnb ...
- hihocoder 二分
题目 一个简单的二分,只是想说明一下,如若要查找一个数组中某个数的下标可以直接用lower_bound()这个函数.只是要考虑到要查找的数不在数组中的这种情况. #include <cstdio ...
- python学习之高阶函数
filter函数:filter()为已知的序列的每个元素调用给定的布尔函数,调用中,返回值为非零的元素将被添加至一个列表中 list = filter(调用函数名,可迭代对象)——调用函数名自动传参— ...
- [violet2]sillyz
题意:定义S(n) = n*各数位之积,然后给定L<=R<=10^18,求有多少个n在[L,R]区间内 思路: 看了半天无从下手..看完题解才豁然开朗.. 具体思路看vani神博客吧.讲的 ...
- 蒲公英: 一个提供App 存储、分发、Bug管理的网站
一.蒲公英内测应用, https://www.pgyer.com/ 内测应用,仅需两步: 将应用上传到网站,生成安装链接和二维码 用户在手机上打开安装链接,或扫码二维码,即可开始安装 二.蒲公英Bug ...
- caffe 教程
Caffe是一个清晰而高效的深度学习框架,本文详细介绍了caffe的优势.架构,网络定义.各层定义,Caffe的安装与配置,解读了Caffe实现的图像分类模型AlexNet,并演示了CIFAR-10在 ...