Python併發程式設計之程序池

2021-10-09 00:10:46 字數 2765 閱讀 4027

前言:本博文主要講解python併發程式設計中的程序池(pool)。

python多程序中的multiprocessing

python多程序中的fork

python程序通訊之queue

當我們需要建立的子程序數量不多時,可以直接利用multiprocessing中的process動態成生多個程序,但如果是上百甚至上千個目標,手動的去建立程序的工作量巨大,此時就可以用到multiprocessing模組提供的pool方法。

初始化pool時,可以指定乙個最大程序數(如果沒有指定,則按無限大處理。此時,在生成子程序時會高速處理、程式也在切換,會損耗效能),當有新的請求提交到pool中時,如果池還沒有滿,那麼就會建立乙個新的程序用來執行該請求;但如果池中的程序數已經達到指定的最大值,那麼該請求就會等待,直到池中有程序結束,才會建立新的程序來執行,請看下面的例項:

from multiprocessing import pool

import time, os, random

deftest1

(msg)

: t_start = time.time(

)print

("%s開始執行,程序號為%d"

%(msg, os.getpid())

) time.sleep(random.random()*

2)t_stop = time.time(

)print

("%s執行完成,耗時%.2f"

%(msg, t_stop - t_start)

)if __name__ ==

"__main__"

:# 定義乙個程序池,最大程序數2

po = pool(2)

for i in

range(1

,6):

# 每次迴圈將會用空閒出來的子程序去呼叫目標

(i,)

)print

("-----start-----"

) po.close(

)# 關閉程序池,關閉後po不再接收新的請求

po.join(

)# 等待po中所有子程序執行完成,必須放在close語句之後

multiprocessing.pool常用函式解析:close():關閉pool,使其不再接受新的任務;

terminate():不管任務是否完成,立即終止;

join():主程序阻塞,等待子程序的退出, 必須在close或terminate之後使用。

from multiprocessing import pool

import time, os, random

deftest1

(msg)

: t_start = time.time(

)print

("%s開始執行,程序號為%d"

%(msg, os.getpid())

) time.sleep(random.random()*

2)t_stop = time.time(

)print

("%s執行完成,耗時%.2f"

%(msg, t_stop - t_start)

)if __name__ ==

"__main__"

:# 定義乙個程序池,最大程序數2

po = pool(2)

for i in

range(1

,6):

# 每次迴圈將會用空閒出來的子程序去呼叫目標

po.(test1,

(i,)

)print

("-----start-----"

) po.close(

)# 關閉程序池,關閉後po不再接收新的請求

po.join(

)# 等待po中所有子程序執行完成,必須放在close語句之後

print

("-----end-----"

)

我們都知道:程序的切換是作業系統來控制的,搶占式的切換模式。當我們首先執行主程序的時候,cpu執行的很快,那麼當我們的主程序就執行完畢,整個程式結束。此時,子程序完全沒有機會切換到程式,就已經結束了。

首先主程序開始執行,碰到子程序,作業系統切換到子程序,等待子程序執行結束後,再切換到另外乙個子程序,直到所有子程序執行完畢。然後在切換到主程序,執行剩餘的部分。此時,我們可以發現,我們的程式其實是阻塞的,它一次只能執行乙個程序,且執行完畢才會到下乙個程序,完全沒有利用我們多程序的優勢。

首先主程序開始執行,碰到子程序後,主程序說:讓我先執行個夠,等到作業系統進行程序切換的時候,再交給子程序執行。因為我們的程式太短,然而還沒等到作業系統進行程序切換,主程序就執行完畢了。想要子程序執行,就告訴主程序:你等著所有子程序執行完畢後,再執行剩餘部分。

那麼此時,我們需要以下兩行**:

pool.close(

)pool.join(

)

注意:我們先要close()一下子程序池, 而且要先在join()前執行它。

併發程式設計之執行緒池,程序池

池 受限於硬體的發展,硬體跟不上軟體的發展 在保證計算機硬體安全的情況下,最大限度的利用了計算機 池其實是降低了程式的執行效率,但是保證了計算機硬體的安全 我們再使用程序和執行緒時,不可能無限制的去開程序或執行緒。因此我們需要用到程序池,執行緒池來解決這一問題。1.concurrent模組是用來建立...

併發程式設計之程序

在python中大部分情況需要使用多程序。python提供了multiprocessing。multiprocessing模組用來開啟子程序,並在子程序中執行我們定製的任務 比如函式 該模組與多執行緒模組threading的程式設計介面類似。multiprocessing模組的功能眾多 支援子程序 ...

併發程式設計之 執行緒池

執行緒池做的工作主要是控制執行的執行緒的數量,處理過程中將任務放入佇列,然後再執行緒建立後啟動這些任務,如果執行緒數量超過了最大數量,超出數量的執行緒排隊等候,等其它執行緒執行完畢,再從佇列中取出任務來執行。他的主要特點為 執行緒復用 控制最大併發數,管理執行緒。第一 降低資源消耗。通過重複利用已建...