python異步執行函數,Python使用BoundedSemaphore對象進行線程同步

 2023-10-04 阅读 25 评论 0

摘要:Semaphore對象維護著一個內部計數器,調用acquire()方法時該計數器減1,調用release()方法時該計數器加1,適用于需要控制特定資源的并發訪問線程數量的場合。調用acquire()方法時,如果計數器已經為0則阻塞當前線程,直到有其他線程調用了rel

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

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/112777.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息