經過前面對 線程互斥鎖lock / 線程事件event / 線程條件變量condition / 線程定時器timer 的講解,相信你對線程threading模塊已經有了必定的瞭解,同時執行多個線程的確能夠提升程序的效率,可是並不是線程的數量越多越好,可能對於計算機而言,你直接運行20~30線程可能沒太大影響,若是同時運行上千個甚至上萬個呢?我相信你電腦會直接癱瘓……python
多線程同時運行,能提升程序的運行效率,可是並不是線程越多越好,而semaphore信號量能夠經過內置計數器來控制同時運行線程的數量,啓動線程(消耗信號量)內置計數器會自動減一,線程結束(釋放信號量)內置計數器會自動加一;內置計數器爲零,啓動線程會阻塞,直到有本線程結束或者其餘線程結束爲止;git
acquire() — 消耗信號量,內置計數器減一;github
release() — 釋放信號量,內置計數器加一;微信
在semaphore信號量有一個內置計數器,控制線程的數量,acquire()會消耗信號量,計數器會自動減一;release()會釋放信號量,計數器會自動加一;當計數器爲零時,acquire()調用被阻塞,直到release()釋放信號量爲止。多線程
建立多個線程,限制同一時間最多運行5個線程,示例代碼以下:併發
1app 2ide 3函數 4學習 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
# !usr/bin/env python # -*- coding:utf-8 _*- """ @Author:何以解憂 @Blog(我的博客地址): shuopython.com @WeChat Official Account(微信公衆號):猿說python @Github:www.github.com
@File:python_semaphore.py @Time:2019/10/23 21:25
@Motto:不積跬步無以致千里,不積小流無以成江海,程序人生的精彩須要堅持不懈地積累! """
# 導入線程模塊 import threading # 導入時間模塊 import time
# 添加一個計數器,最大併發線程數量5(最多同時運行5個線程) semaphore = threading.Semaphore(5)
def foo(): semaphore.acquire() #計數器得到鎖 time.sleep(2) #程序休眠2秒 print("當前時間:",time.ctime()) # 打印當前系統時間 semaphore.release() #計數器釋放鎖
if __name__ == "__main__":
thread_list= list() for i in range(20): t=threading.Thread(target=foo,args=()) #建立線程 thread_list.append(t) t.start() #啓動線程
for t in thread_list: t.join()
print("程序結束!") |
輸出結果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
當前時間: Wed Oct 23 22:21:59 2019 當前時間: Wed Oct 23 22:21:59 2019 當前時間: Wed Oct 23 22:21:59 2019 當前時間: Wed Oct 23 22:21:59 2019 當前時間: Wed Oct 23 22:21:59 2019 當前時間: Wed Oct 23 22:22:01 2019 當前時間: Wed Oct 23 22:22:01 2019 當前時間: Wed Oct 23 22:22:01 2019 當前時間: Wed Oct 23 22:22:01 2019 當前時間: Wed Oct 23 22:22:01 2019 當前時間: Wed Oct 23 22:22:03 2019 當前時間: Wed Oct 23 22:22:03 2019 當前時間: Wed Oct 23 22:22:03 2019 當前時間: Wed Oct 23 22:22:03 2019 當前時間: Wed Oct 23 22:22:03 2019 當前時間: Wed Oct 23 22:22:05 2019 當前時間: Wed Oct 23 22:22:05 2019 當前時間: Wed Oct 23 22:22:05 2019 當前時間: Wed Oct 23 22:22:05 2019 當前時間: Wed Oct 23 22:22:05 2019 程序結束! |
根據打印的日誌能夠看出,同一時間只有5個線程運行,間隔兩秒以後,再次啓動5個線程,直到20個線程所有運行結束爲止;若是沒有設置信號量Semapaore,建立線程直接start(),輸出的時間所有都是同樣的,這個問題比較簡單,能夠本身去實驗一下!
轉載請註明:猿說Python » python線程信號量semaphore