python 執行緒池 python執行緒池原始碼解析

2021-10-11 19:45:05 字數 1564 閱讀 2561

本篇主要講下threadpoolexecutor的實現。

由於業務量不大,且一直使用框架進行程式設計,對執行緒的理解一直很模糊,基本處於不想阻塞程式執行,起乙個執行緒啟動任務的階段。總感覺自己好像會執行緒一樣,實則一直處於一種懵懂狀態,通過一段時間檢視一些別人寫的原始碼,終於有所悟,也記錄下自己的學習過程吧,由於本人水平限制理解有限,拋磚引玉一下。

關於執行緒的原始碼沒什麼好說的,大家可以可以自行檢視,應該是平常程式設計中最常遇到的了。那今天講講執行緒池的實現吧。

首先大家可以自己動手寫寫試試,如果有好的思路可以寫下來之後再檢視,如果沒有大家可以跟著我的思路,看看原始碼中對執行緒池是怎麼實現的。

執行緒池需要解決的問題就是怎麼通過一定數量執行緒,解決提交到執行緒池的任務。原始碼中匯入執行緒池的庫如下:

from concurrent.futures import threadpoolexecutor
整體類圖如下:

繼承自executor,這個類包含了三個方法:

往執行緒池裡提交任務主要包含了submit和map方法,在executor裡已經實現了map方法,它實際也是通過submit來提交大執行緒池的。在使用threadpoolexecutor時候,可以選擇二選一,主要區別就是map返回乙個迭代器物件,且返回的任務結果是有序的,也就是你怎麼輸入的結果會是對應有序的輸出,而submit則是先執行完的先返回結果。

直接看submit就可以了:

也就短短十一行**,大致可分為以下步驟:

獲取執行緒鎖

建立儲存任務狀態的類future,作為任務提交的返回;

把任務包裝成為通用的_workitem類,加入佇列

調整執行緒數量

通過以上步驟不難發現,所謂的執行緒池也就是佇列實現的。啟動不超過執行緒池數量的執行緒,然後從佇列裡獲取任務進行執行,從而使執行緒保持一定數量,沒有任務執行時,就往佇列裡面填入none值,維持執行緒池中所有執行緒處於啟用狀態,確保有任務來不會重新建立執行緒,避免執行緒重新建立的開銷。

每個執行緒具體的執行工作如下:

多讀原始碼可以開闊思路,這些**都是大佬們寫的,可以幫助我們在寫**時看到他們是怎麼想問題和解決問題的;

物件釋放

執行緒安全考慮

3. 很多東西不能做的似是而非的,遇到問題得多動手,看懂不一定是真的懂,比如看完了執行緒池,你是否能寫乙個程序池呢?

python 執行緒池 Python的執行緒池

usr bin env python coding utf 8 concurrent 用於執行緒池和程序池程式設計而且更加容易,在python3.2中才有。import sys from concurrent.futures import threadpoolexecutor,as complete...

python執行緒池

import time threadpool為執行緒池模組 import threadpool deftest str print str time.sleep 2 if name main starttime time.time 建立執行緒池,最多建立的執行緒數為10 pool threadpoo...

Python 執行緒池

給出乙個任務,然後交給執行緒池完成,執行緒池可以設定最大執行緒的數量,所以他會一次執行三個 from concurrent.futures import threadpoolexecutor import time 簡單的執行緒池使用 def consume num time.sleep 2 pri...