深入原理64式 4 python程序池與執行緒池原理

2021-09-29 00:01:16 字數 994 閱讀 7873

1 執行緒池原理

主線程是通過佇列將任務傳遞給多個子執行緒。一旦主線程將任務塞進任務佇列,子執行緒們就會開始爭搶,最終只有乙個執行緒能搶到這個任務,並立即進行執行,執行完後將結果放進future物件就完成了這個任務的完整執行過程。

主線程將任務塞進執行緒池後得到了這個future物件,它內部的_result還是空的。如果主線程呼叫result()方法獲取結果,就會阻塞在條件變數上。如果子執行緒計算任務完成了就會立即呼叫set_result()方法將結果填充進future物件,並喚醒阻塞在條件變數上的執行緒,也就是主線程。這時主線程立即醒過來並正常返回結果。

2 程序池原理

主線程將任務塞進taskqueue(普通記憶體佇列),拿到future物件

唯一的管理執行緒從taskqueue獲取任務,塞進callqueue(分布式跨程序佇列)

子程序從callqueue中爭搶任務進行處理

子程序將處理結果塞進resultqueue(分布式跨程序佇列)

管理執行緒從resultqueue中獲取結果,塞進future物件

主線程從future物件中拿到結果

3 跨程序佇列

程序池模型中的跨程序佇列是用multiprocessing.queue實現的。

它使用無名套接字sockerpair來完成的跨程序通訊,socketpair和socket的區別就在於socketpair不需要埠,不需要走網路協議棧,通過核心的套接字讀寫緩衝區直接進行跨程序通訊。

4 i/o密集型與cpu密集型任務的選擇

concurrent提供了兩種併發模型,乙個是多執行緒threadpoolexecutor,乙個是多程序processpoolexecutor。對於io密集型任務宜使用多執行緒模型。對於計算密集型任務應該使用多程序模型。

是因為python gil的存在讓python虛擬機器在進行運算時無法有效利用多核心。對於純計算任務,它永遠最多只能榨乾單個cpu核心。如果要突破這個瓶頸,就必須fork出多個子程序來分擔計算任務。而對於io密集型任務,cpu使用率往往是極低的。

參考:

深入原理64式 2 django基礎與原理

1 django含義 django是乙個python的web應用框架,採用mtv框架模式。m表示模型,t表示模板,v表示檢視。主要包含建立模型的關係物件對映,url分派,模板等。物件關係對映 orm,用python累定義資料模型,然後orm將模型與關聯式資料庫連線,可以方便使用資料庫。url分派 使...

4 Python 處理 ini 檔案

ini 檔案是initialization file的縮寫,即初始化檔案,是windows的系統配置檔案所採用的儲存格式。一 ini 檔案示例 下面是乙個 ini 檔案 school ip 10.15.40.123 mask 255.255.255.0 gateway 10.15.40.1 dns ...

4 python教程 分支 迴圈

講程式設計,不得不講到順序 分支 迴圈。順序就是從上到下執行 這個很簡單,不用再說了。在講分支 迴圈的時候,要特別注意python 中的強制縮排。我們先看看分支 1 簡單的if else a 1 if a 1 注意後面有乙個冒號。其中 是相等判斷 print 1 注意print 函式之前有乙個tab...