Python使用BoundedSemaphore对象进行线程同步
Semaphore对象维护着一个内部计数器,调用acquire()方法时该计数器减1,调用release()方法时该计数器加1,适用于需要控制特定资源的并发访问线程数量的场合。
调用acquire()方法时,如果计数器已经为0则阻塞当前线程,直到有其他线程调用了release()方法,所以计数器的值永远不会小于0。
Semaphore对象可以调用任意次release()方法,而BoundedSemaphore对象可以保证计数器的值不超过特定的值。
下面的代码使用BoundedSemaphore对象限制特定资源的并发访问线程数量,每次只允许两个线程同时执行。
from threading import Thread, BoundedSemaphore
from time import time, sleep
from random import randrange
def worker(value):
# 线程启动时间
start = time()
with sema:
# 获取资源访问权限的时间
end = time()
# 冒号后面是该线程等待的时间
print(value, ':', end-start)
sleep(randrange(5))
# 同一时刻最多允许2个线程访问特定资源
sema = BoundedSemaphore(2)
# 创建并启动10个线程
for i in range(10):
t= Thread(target=worker, args=(i,))
t.start()
代码的多次运行结果不会完全相同,某次运行结果如下:
0 : 0.0
1 : 0.0
2 : 1.0000569820404053
3 : 3.000171661376953
5 : 4.0002288818359375
4 : 4.0002288818359375
6 : 6.003343343734741
7 : 8.000457525253296
8 : 9.003514766693115
9 : 12.000686407089233
另一次运行结果如下:
0 : 0.0
1 : 0.0
2 : 2.0001144409179688
3 : 2.001114845275879
4 : 2.003114700317383
5 : 3.004171848297119
6 : 3.00517201423645
7 : 4.999285697937012
8 : 5.000285863876343
9 : 7.0054004192352295
Python使用BoundedSemaphore对象进行线程同步相关推荐
- 线程同步——内核对象实现线程同步——等待函数
1 对于内核对象实现线程同步,不得不提三点: 2 1)大多数内核对象既有触发也有未触发两个状态 3 比如:进程.线程.作业.文件流.事件.可等待的计时器.信号量.互斥量 4 2)等待函数:等待函数使线 ...
- Windows核心编程:第9章 用内核对象进行线程同步
Github https://github.com/gongluck/Windows-Core-Program.git //第9章 用内核对象进行线程同步.cpp: 定义应用程序的入口点. //#in ...
- 微课|Python使用Barrier对象实现多线程同步
中国大学MOOC"Python程序设计基础"第5次开课 推荐教材: <Python网络程序设计(微课版)>,ISBN:978-7-3025-8312-7,董付国,清华大 ...
- 用内核对象进行线程同步
本章讨论的是如何使用内核对象来对线程进行同步,与用户模式下的同步机制相比,内核对象的用途要广泛的多.实际上,内核对象唯一的缺点就是他们的性能.当我们调用本章任何一个新函数时,调用线程必须从用户模式切换 ...
- Python的BoundedSemaphore对象和Pool对象实例
BoundedSemaphore对象: from threading import Thread, BoundedSemaphore from time import time,sleepdef ex ...
- 《Windows via C/C++》学习笔记 —— 内核对象的“线程同步”之“信号量”
"信号量内核对象"用于对资源进行计数. 在信号量内核对象内部,和其他内核对象一样,有一个使用计数,该使用计数表示信号量内核对象被打开的次数. 信号量内核对象中还有两个比较重要的数据 ...
- python编程(改进的线程同步方式)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 在实际代码开发中,gui的代码并不好写.因为不管是mvc.还是mvp都有一定的局限性.那么,这个 ...
- Python使用Condition对象实现多线程同步
使用Condition对象可以在某些事件触发后才处理数据或执行特定的功能代码,可以用于不同线程之间的通信或通知,以实现更高级别的同步.在内部实现上,Condition对象总是与某种锁对象相关联. Co ...
- 内核对象用于线程同步
事件内核对象 等待成功所引起的副作用,当事件对象被触发的时候,函数会检测到这一情况,这里它可以直接返回WAIT_OBJECT_0给调用线程,但是在函数返回之前, 它会使事件变为非触发状态---这就是副 ...
最新文章
- php帝国系统调出图片内空,帝国CMS图集字段的大图,小图,说明的调用方法
- java mybatis狂神说sql_帮你搞定Java面试,不要再错过了
- php stdclass,php – 处理stdClass对象
- 对象化下的编程——字段
- 重装系统后恢复oracle数据
- 2019-ACM-ICPC-南京区网络赛-E. K Sum(莫比乌斯反演 + 杜教筛)
- React开发(214):React中的Fragments
- 【2017年第3期】专题:面向社会治理和服务的大数据
- python与机器学习(四)——线性回归和逻辑斯蒂回归
- python __main__ __name__ __file__
- SQLite性能提升10倍的Web数据库
- python 面试必问,不会真的要打脸~
- readonly(C# 参考)
- 力扣14最长公共子串
- Tomcat介绍和MyEclipse搭建DRP系统
- ACCESS品牌管理集团为你甄选生活好物 VTN会员商城与品质的故事
- scratch双语教师课件文档手册 1.初识scratch
- 常见的二范数是什么意思?有什么用?
- FFmpeg的HEVC解码器源代码简单分析
- git fetch总结
热门文章
- linux+html5+开发工具,记不住 Linux 命令?这三个工具可以帮你
- 语言怎么表示词谱_跨语言词表示方法(一)
- android command line tools 下载,Mac 安装 Android commandlinetools 各种报错的问题
- linux系统下 新建文件夹,使用ln命令在Linux系统中创建连接文件
- 乌班图服务器系统怎么配ip,Ubuntu server14-04 服务器双网卡怎么配置静态ip
- Oracle11g新特性:在线操作功能增强-Oracle11g在线重定义功能对物化视图... (转载)
- 1小时搞懂设计模式之工厂模式(简单工厂)
- Java边缘填充_任意画一个多边形,用边缘填充算法填充
- php函数fiter,PHP filter_var() 函数和 Filter 函数使用说明
- 关键字this、new;apply、call、bind方法的用法