前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python使用BoundedSemaphore对象进行线程同步

Python使用BoundedSemaphore对象进行线程同步

作者头像
Python小屋屋主
发布2018-04-16 15:00:05
1.6K0
发布2018-04-16 15:00:05
举报
文章被收录于专栏:Python小屋Python小屋

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-05-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python小屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档