Contenu connexe
Similaire à 13.並行、平行與非同步 (9)
13.並行、平行與非同步
- 6. • 雖可以繼承 threading.Thread, 在
__init__()呼叫 super().__init__(),
並在類別中定義run()方法來實作執行緒
• 不過是不建議的,因為這會使得你的流程與
threading.Thread 產生相依性
6
- 24. • threading.RLock 實現了可重入鎖
(Reentrant lock)
• 同一執行緒可以重複呼叫同一個
threading.RLock 實例的 acquire()
而不被阻斷
• release()時也要有對應於 acquire()
的次數,方可以完全解除鎖定
• threading.RLock 也實作了情境管理器
協定,可搭配 with 來使用
24
- 30. • 建立Semaphore 可指定計數器初始值
• 每呼叫一次 acquire(),計數器值遞減一,
在計數器為0 時若呼叫了 acquire(),執
行緒就會被阻斷
• 每呼叫一次 release(),計數器值遞增一,
如果 release()前計數器為 0,而且有執
行緒正在等待,在 release() 並遞增計數
器之後,會通知等待中的執行緒
30
- 31. • 可以設定一個 Barrier 並指定數量
• 如果有執行緒先來到這個柵欄,它必須等
待其他執行緒也來到這個柵欄
• 指定的執行緒數量達到,全部執行緒才能
繼續往下執行
31
- 35. • 從 Python 3.5 開始,建議使用 run() 函
式來呼叫子行程
• subprocess.run() 執行之後會傳回
CompletedProcess 實例
• 若想要能取得標準輸出的執行結果:
35
- 47. 非同步
• Python 3.2 新增 concurrent.futures
模組,它提供了執行緒或行程高階封裝,
也便於實現非同步的任務
• 從 Python 3.5 之後,提供了async、
await 等語法,以及 asyncio 模組的支援,
如果非同步任務涉及大量的輸入輸出,可
以善用這些特性
47
- 66. • 如果在定義函式時,加上了 async 關鍵字,
呼叫該函式並不會馬上執行函式流程,而
是傳回一個 coroutine 物件
• 想要執行函式中定義的流程,可以透過
asyncio.run() 函式
66
- 73. async、await 與非同步
• async 用來標示函式執行時是非同步,也
就是函式中定義定義了獨立於程式主流程
的任務
• 後續若要在任務完成時,做進一步的處理
也是可行的
• 從 Python 3.5 開始,可以使用await
73
- 75. • 就語義上,若想等待 async 函式執行完後,
再執行後續的流程,可以使用await
• async 函式的任務完成後若有傳回值,會
成為 await 的傳回值
75