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. 线程同步——内核对象实现线程同步——等待函数

    1 对于内核对象实现线程同步,不得不提三点: 2 1)大多数内核对象既有触发也有未触发两个状态 3 比如:进程.线程.作业.文件流.事件.可等待的计时器.信号量.互斥量 4 2)等待函数:等待函数使线 ...

  2. Windows核心编程:第9章 用内核对象进行线程同步

    Github https://github.com/gongluck/Windows-Core-Program.git //第9章 用内核对象进行线程同步.cpp: 定义应用程序的入口点. //#in ...

  3. 微课|Python使用Barrier对象实现多线程同步

    中国大学MOOC"Python程序设计基础"第5次开课 推荐教材: <Python网络程序设计(微课版)>,ISBN:978-7-3025-8312-7,董付国,清华大 ...

  4. 用内核对象进行线程同步

    本章讨论的是如何使用内核对象来对线程进行同步,与用户模式下的同步机制相比,内核对象的用途要广泛的多.实际上,内核对象唯一的缺点就是他们的性能.当我们调用本章任何一个新函数时,调用线程必须从用户模式切换 ...

  5. Python的BoundedSemaphore对象和Pool对象实例

    BoundedSemaphore对象: from threading import Thread, BoundedSemaphore from time import time,sleepdef ex ...

  6. 《Windows via C/C++》学习笔记 —— 内核对象的“线程同步”之“信号量”

    "信号量内核对象"用于对资源进行计数. 在信号量内核对象内部,和其他内核对象一样,有一个使用计数,该使用计数表示信号量内核对象被打开的次数. 信号量内核对象中还有两个比较重要的数据 ...

  7. python编程(改进的线程同步方式)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 在实际代码开发中,gui的代码并不好写.因为不管是mvc.还是mvp都有一定的局限性.那么,这个 ...

  8. Python使用Condition对象实现多线程同步

    使用Condition对象可以在某些事件触发后才处理数据或执行特定的功能代码,可以用于不同线程之间的通信或通知,以实现更高级别的同步.在内部实现上,Condition对象总是与某种锁对象相关联. Co ...

  9. 内核对象用于线程同步

    事件内核对象 等待成功所引起的副作用,当事件对象被触发的时候,函数会检测到这一情况,这里它可以直接返回WAIT_OBJECT_0给调用线程,但是在函数返回之前, 它会使事件变为非触发状态---这就是副 ...

最新文章

  1. php帝国系统调出图片内空,帝国CMS图集字段的大图,小图,说明的调用方法
  2. java mybatis狂神说sql_帮你搞定Java面试,不要再错过了
  3. php stdclass,php – 处理stdClass对象
  4. 对象化下的编程——字段
  5. 重装系统后恢复oracle数据
  6. 2019-ACM-ICPC-南京区网络赛-E. K Sum(莫比乌斯反演 + 杜教筛)
  7. React开发(214):React中的Fragments
  8. 【2017年第3期】专题:面向社会治理和服务的大数据
  9. python与机器学习(四)——线性回归和逻辑斯蒂回归
  10. python __main__ __name__ __file__
  11. SQLite性能提升10倍的Web数据库
  12. python 面试必问,不会真的要打脸~
  13. readonly(C# 参考)
  14. 力扣14最长公共子串
  15. Tomcat介绍和MyEclipse搭建DRP系统
  16. ACCESS品牌管理集团为你甄选生活好物 VTN会员商城与品质的故事
  17. scratch双语教师课件文档手册 1.初识scratch
  18. 常见的二范数是什么意思?有什么用?
  19. FFmpeg的HEVC解码器源代码简单分析
  20. git fetch总结

热门文章

  1. linux+html5+开发工具,记不住 Linux 命令?这三个工具可以帮你
  2. 语言怎么表示词谱_跨语言词表示方法(一)
  3. android command line tools 下载,Mac 安装 Android commandlinetools 各种报错的问题
  4. linux系统下 新建文件夹,使用ln命令在Linux系统中创建连接文件
  5. 乌班图服务器系统怎么配ip,Ubuntu server14-04 服务器双网卡怎么配置静态ip
  6. Oracle11g新特性:在线操作功能增强-Oracle11g在线重定义功能对物化视图... (转载)
  7. 1小时搞懂设计模式之工厂模式(简单工厂)
  8. Java边缘填充_任意画一个多边形,用边缘填充算法填充
  9. php函数fiter,PHP filter_var() 函数和 Filter 函数使用说明
  10. 关键字this、new;apply、call、bind方法的用法