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多线程实际应用,且假设读者已经了解多线程的基本概念.如果读者对进程线程概念不甚了解,可参见知名博主 阮一峰 ...
随机推荐
- hibernate添加数据报错:Could not execute JDBC batch update
报错如下图所示: 报错原因:在配置文件或注解里设置了字段关联,但数据却没有关联. 解决方法:我的错误是向一个多对多的关联表里插入数据,由于表中一个字段的数据是从另一张表里get到的,通过调试发现,从以 ...
- 已经安装了客户端,但是cmd输入sqlcmd报错:Sqlcmd:Error:Connection failure.SQL Native Client is not installed correctly
以前安装了sqlserver2008,没有卸载掉,后面又安装了sqlserver2014,所以系统环境变量中既有2008的环境变量的配置,又有2014的环境变量的配置,所以在终端输入sqlcmd时报错 ...
- user表中存在多条相同user不同host用户信息时MySQL该匹配哪条记录登录?
问题: 当用户名相同,但主机名不同的多条记录.用户由不同主机登录时,选择使用那条记录来验证,数据库版本为:5.6.25 如:IP为192.168.141.241 hostname为vhost02主机上 ...
- 阿里云对象存储oss上传文件夹
最近公司做工程项目,实现文件夹云存储上传. 网上找了一天,发现网上很多代码都存在相似问题,最后终于找到了一个满足我需求的项目. 工程如下: 这里对项目的大文件传输功能做出分析,怎么实现文件夹上传的,如 ...
- 属性动画和Activity、Fragment过渡动画等
主题是关于动画的,但是不是什么动画的内容都包括.先泛泛的介绍一下,然后详细的介绍一下翻代码找见的一个好玩的动画的使用.以下的内容包括Android 3和Android 3.1等引入的API,在使用中请 ...
- Alpha阶段敏捷冲刺(五)
1.站立式会议 提供当天站立式会议照片一张 2.每个人的工作 (有work item 的ID),并将其记录在码云项目管理中: 昨天已完成的工作. 祁泽文:实现了个人遗忘曲线图 徐璐琳:完成了微信Web ...
- web-day2
第2章WEB02-CSS&JS篇 今日任务 使用CSS完成网站首页的美化 使用CSS完成网站注册页面的美化 使用JS完成简单的数据校验 使用JS完成图片轮播效果 教学导航 教学目标 了解CSS ...
- Foundation-NSRunLoop
Objective-C之run loop详解 Objective-C之run loop详解 RunLoop 详解
- 微软新一代Surface发布,参数曝光
在沉寂许久之后,Surface 2及Surface Pro 2又有猛料爆出,这一次不单单是新品展示,伴随的还有更多的详细的参数和全新配件. 从外观来看,新一代的Surface外形上沿袭了上一代,但颜色 ...
- 如何更好地使用Java 8的Optional
Java 8中的Optional<T> 是一个可以包含或不可以包含非空值的容器对象,在 Stream API中很多地方也都使用到了Optional. java中非常讨厌的一点就是nullp ...