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多线程实际应用,且假设读者已经了解多线程的基本概念.如果读者对进程线程概念不甚了解,可参见知名博主 阮一峰 ...
随机推荐
- Ubuntu下删除卸载程序图标
Ubuntu下删除卸载程序图标 方法一:直接在终端输入命令alacarte.可以任意增.改.隐藏.显示菜单,但无法删除菜单,即使拥有root权限. 方法二:注意几个目录和文件./usr/share/a ...
- VSCode 设置侧边栏字体大小;Visual Studio Code改变侧边栏大小
1.代码改写,进入默认安装的如下路径 C:\Users\Administrator\AppData\Local\Programs\Microsoft VS Code\resources\app\out ...
- Java理论学时第三节。课后作业。
如果一个类中既有初始化块,又有构造方法,同时还设定了字段的初始值,谁说了算? 运行结果. 根据我的总结,它们三个的优先级是:构造方法 > 字段初始值 > 初始化块. 当多个类之间有继承关系 ...
- Beta阶段第四篇Scrum冲刺博客-Day3
1.站立式会议 提供当天站立式会议照片一张 2.每个人的工作 (有work item 的ID),并将其记录在码云项目管理中: 昨天已完成的工作. 张晨晨:学习新的测试模块需要的东西 郭琪容:学习复习模 ...
- 网络timeout区分
ConnectTimeout 连接建立时间,三次握手完成时间 SocketTimeout 数据传输过程中数据包之间间隔的最大时间 下面重点说下SocketTimeout,比如有如下图所示的http请求 ...
- ACE Editor在线代码编辑器简介及使用引导
转自博客:https://www.cnblogs.com/cz-xjw/p/6476179.html ACE 是一个开源的.独立的.基于浏览器的代码编辑器,可以嵌入到任何web页面或JavaScrip ...
- Excel 多个单元格输入同样内容
step1: 将这些单元格选定.方法:可以连续选,也可以 ctrl + select不连续选择: step2:输入你想输入的内容,PS:出现在最后选择的单元格中: step3:组合键:ctrl + e ...
- 托管博客到coding或者github
1. 部署网站到github的pages服务 参考: <在Github上面搭建Hexo博客(一):部署到Github> <Hexo搭建独立博客,托管到Github和Coding上教程 ...
- 纸壳CMS主题增强,支持主题中加入模板
背景 在之前,纸壳CMS的主题仅仅只是CSS样式,并不支持在主题下使用模板来构建不同的HTML结构.现在我们对主题功能做了增强,可以在主题下添加各自的模板,这样在制作主题时,就会更加自由.不仅如此,新 ...
- ovs-appctl 命令合集
通用命令 exit 优雅关闭ovs-vswitchd进程 qos/show interface 查询内核中关于qos的配置以及和给出端口有关的状态 cfm/show [interface]显示在指定端 ...