Python-訊號量和執行緒池-semaphore ThreadPoll
訊號量
其實本質上是鎖,Lock是單鎖,訊號量是指定多把鎖,也就是說透過訊號量指定多個數執行緒可以訪問相同資源,一般情況下讀操作可以有多個,但寫操作同時只有一個
訊號量模組 semaphore
# 使用起來和普通鎖沒 什麼區別,但這個是比鎖更加粗粒度鎖,鎖的是執行緒
# 線上程例項前加鎖,把鎖傳遞進執行緒,線上程結束時候釋放鎖
from threading import Thread, Semaphore from queue import Queue def add(chan, sem_lock): for i in range ( 10 ): chan.put(i) # 釋放鎖 sem_lock.release() if __name__ = = '__main__' : numbers = Queue() # 申明訊號量 sem_lock = Semaphore( 4 ) sem_lock.acquire() # 把鎖傳遞進執行緒 tasks = {Thread(target = add, args = (numbers, sem_lock), name = "北門吹雪 %s" % i) for i in range ( 10 )} for task in tasks: task.start() for task in tasks: task.join() print (numbers.get())
|
執行緒池
不僅僅是數量控制,可以獲取執行緒狀態、任務狀態、執行緒返回值等資訊
執行緒池模組 ThreadPollExecutor
執行緒池使用過程
1. 例項化執行緒池
2. 提交任務,會有個返回物件,submit是不會堵塞,立即返回
3. 讓主執行緒等待執行緒執行完成
4. 關閉執行緒池
獲取狀態資訊 執行緒物件
1. 判斷是否執行完 .done()
2. 獲取任務執行結果,堵塞 .result()
3. 取消任務 .cancle()
對多個執行緒列表獲取結果 執行緒物件
1. as_complated 獲取已經執行完成的執行緒結果
def add(number, name): sum = 0 for i in range (number): sum + = i # 模擬個執行緒執行堵塞情況 time.sleep(random()) # 返回執行緒執行結果 return sum if __name__ = = '__main__' : thread_pool = ThreadPoolExecutor(max_workers = 3 ) print ( "北門吹雪:http://www.cnblogs.com/2bjiujiu/" ) name = "北門吹雪" tasks = {thread_pool.submit(add, randint( 10 , 20 ), name) for _ in range ( 20 )} # map方法和as_completed最大區別在於map變化的只是引數執行緒是同一個執行緒,而as_completed可以執行不同的執行緒任務 for data in thread_pool. map (add, {randint( 10 , 20 ) for _ in range ( 20 )}): print (data)
|
2. map 直接返回執行緒執行結果,保持傳遞進去順序
def add(number): sum = 0 for i in range (number): sum + = i # 模擬個執行緒執行堵塞情況 time.sleep(random()) # 返回執行緒執行結果 return sum if __name__ = = '__main__' : print ( "北門吹雪" ) thread_pool = ThreadPoolExecutor(max_workers = 3 ) tasks = {thread_pool.submit(add, randint( 10 , 20 )) for _ in range ( 20 )} # map方法和as_completed最大區別在於map變化的只是引數執行緒是同一個執行緒,而as_completed可以執行不同的執行緒任務 for data in thread_pool. map (add, {randint( 10 , 20 ) for _ in range ( 20 )}): print (data)
|
3. wait 等待所有執行緒執行完成
from concurrent.futures import ThreadPoolExecutor, as_completed, wait from random import randint, random import time def add(number): sum = 0 for i in range (number): sum + = i # 模擬個執行緒執行堵塞情況 time.sleep(random()) # 返回執行緒執行結果 return sum if __name__ = = '__main__' : thread_pool = ThreadPoolExecutor(max_workers = 3 ) tasks = {thread_pool.submit(add, randint( 10 , 20 )) for _ in range ( 20 )} print ( "北門吹雪" ) # 主執行緒等待所有子執行緒執行完,不需要結果 # wait(tasks)
|
1 |
|
經驗:
1. 執行緒池和訊號量在某種程度如允許執行的執行緒數效果上是一樣,但執行緒池可以獲取執行緒執行結果得到執行緒執行狀態
2. 使用執行緒池需要首先例項化,然後提交執行緒,返回執行緒物件,然後在主執行緒中選擇獲取結果或者不需要結果,也可以選擇堵塞等待執行緒執行完或不等待執行緒執行完
3. 獲取執行緒執行結果,可以參照Go語言中CSP通訊模式,個人覺得這是個非常好的解決方案,這樣的執行緒池介面提交遠比CSP通訊來的複雜
1 |
|
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2144/viewspace-2802505/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java多執行緒併發工具類-訊號量Semaphore物件講解Java執行緒物件
- java-多執行緒-CountDownLatch(閉鎖) CyclicBarrier(柵欄) Semaphore(訊號量)-Java執行緒CountDownLatch
- VC訊號量和執行緒的用法執行緒
- Java多執行緒—執行緒同步(單訊號量互斥)Java執行緒
- windows多執行緒同步--訊號量Windows執行緒
- 執行緒和執行緒池執行緒
- 10. Semaphore ||(訊號量)
- 利用訊號量實現執行緒順序執行執行緒
- 執行緒同步(windows平臺):訊號量執行緒Windows
- iOS多執行緒非同步訊號量iOS執行緒非同步
- Semaphore訊號量原始碼解析原始碼
- 執行緒池監控2-監控執行緒池狀態、執行緒數量和佇列任務數量等執行緒佇列
- java多執行緒系列:Semaphore和ExchangerJava執行緒
- Java多執行緒——SemaphoreJava執行緒
- C++ 多執行緒框架 (2):Mutex 互斥和 Sem 訊號量C++執行緒框架Mutex
- 原始碼分析:Semaphore之訊號量原始碼
- Python執行緒專題5:訊號量與有邊界的訊號量Python執行緒
- 多執行緒之間通訊及執行緒池執行緒
- Android的執行緒和執行緒池Android執行緒
- 多執行緒-執行緒池的概述和使用執行緒
- Java執行緒池二:執行緒池原理Java執行緒
- Semaphore-訊號量的實現分析
- iOS GCD (四) dispatch_semaphore 訊號量iOSGC
- Java併發工具類(訊號量Semaphore)Java
- 淺談執行緒池(上):執行緒池的作用及CLR執行緒池執行緒
- 執行緒池和Executor框架執行緒框架
- 多執行緒【執行緒池】執行緒
- 執行緒 執行緒池 Task執行緒
- 多執行緒:執行緒池理解和使用總結執行緒
- 《Java 高階篇》七:執行緒和執行緒池Java執行緒
- 執行緒池的建立和使用,執行緒池原始碼初探(篇一)執行緒原始碼
- SpringBoot執行緒池和Java執行緒池的實現原理Spring Boot執行緒Java
- Java 併發:執行緒、執行緒池和執行器全面教程Java執行緒
- Java中命名執行器服務執行緒和執行緒池Java執行緒
- 執行緒池執行緒
- 淺談執行緒池(中):獨立執行緒池的作用及IO執行緒池執行緒
- Java多執行緒——執行緒池Java執行緒
- go中semaphore(訊號量)原始碼解讀Go原始碼