日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python3多进程 pool manager_Python多进程multiprocessing.Pool

發布時間:2025/3/19 python 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python3多进程 pool manager_Python多进程multiprocessing.Pool 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Multiprocessing.Pool可以提供指定數量的進程供用戶調用,當有新的請求提交到pool中時,如果池還沒有滿,那么就會創建一個新的進程用來執行該請求;但如果池中的進程數已經達到規定最大值,那么該請求就會等待,直到池中有進程結束,才會創建新的進程來執行它。在共享資源時,只能使用Multiprocessing.Manager類,而不能使用Queue或者Array。

Pool介紹

用途

Pool類用于需要執行的目標很多,而手動限制進程數量又太繁瑣時,如果目標少且不用控制進程數量則可以用Process類。

構造方法

Pool([processes[, initializer[, initargs[, maxtasksperchild[, context]]]]])

processes :使用的工作進程的數量,如果processes是None那么使用 os.cpu_count()返回的數量。

initializer: 如果initializer是None,那么每一個工作進程在開始的時候會調用initializer(*initargs)。

maxtasksperchild:工作進程退出之前可以完成的任務數,完成后用一個新的工作進程來替代原進程,來讓閑置的資源被釋放。maxtasksperchild默認是None,意味著只要Pool存在工作進程就會一直存活。

context: 用在制定工作進程啟動時的上下文,一般使用 multiprocessing.Pool() 或者一個context對象的Pool()方法來創建一個池,兩種方法都適當的設置了context。

實例方法

apply_async(func[, args[, kwds[, callback]]]) 它是非阻塞。

apply(func[, args[, kwds]])是阻塞的。

close() 關閉pool,使其不在接受新的任務。

terminate() 關閉pool,結束工作進程,不在處理未完成的任務。

join() 主進程阻塞,等待子進程的退出, join方法要在close或terminate之后使用。

Pool使用方法

Pool+map函數

說明:此寫法缺點在于只能通過map向函數傳遞一個參數。

from multiprocessing import Pool

def test(i):

print i

if __name__=="__main__":

lists=[1,2,3]

pool=Pool(processes=2) #定義最大的進程數

pool.map(test,lists) #p必須是一個可迭代變量。

pool.close()

pool.join()

異步進程池(非阻塞)

from multiprocessing import Pool

def test(i):

print i

if __name__=="__main__":

pool = Pool(processes=10)

for i in xrange(500):

'''

For循環中執行步驟:

(1)循環遍歷,將500個子進程添加到進程池(相對父進程會阻塞)

(2)每次執行10個子進程,等一個子進程執行完后,立馬啟動新的子進程。(相對父進程不阻塞)

apply_async為異步進程池寫法。

異步指的是啟動子進程的過程,與父進程本身的執行(print)是異步的,而For循環中往進程池添加子進程的過程,與父進程本身的執行卻是同步的。

'''

pool.apply_async(test, args=(i,)) #維持執行的進程總數為10,當一個進程執行完后啟動一個新進程.

print “test”

pool.close()

pool.join()

執行順序:For循環內執行了2個步驟,第一步:將500個對象放入進程池(阻塞)。第二步:同時執行10個子進程(非阻塞),有結束的就立即添加,維持10個子進程運行。(apply_async方法的會在執行完for循環的添加步驟后,直接執行后面的print語句,而apply方法會等所有進程池中的子進程運行完以后再執行后面的print語句)

注意:調用join之前,先調用close或者terminate方法,否則會出錯。執行完close后不會有新的進程加入到pool,join函數等待所有子進程結束。

同步進程池(阻塞)

from multiprocessing import Pool

def test(p):

print p

time.sleep(3)

if __name__=="__main__":

pool = Pool(processes=10)

for i in xrange(500):

'''

實際測試發現,for循環內部執行步驟:

(1)遍歷500個可迭代對象,往進程池放一個子進程

(2)執行這個子進程,等子進程執行完畢,再往進程池放一個子進程,再執行。(同時只執行一個子進程)

for循環執行完畢,再執行print函數。

'''

pool.apply(test, args=(i,)) #維持執行的進程總數為10,當一個進程執行完后啟動一個新進程.

print “test”

pool.close()

pool.join()

說明:for循環內執行的步驟順序,往進程池中添加一個子進程,執行子進程,等待執行完畢再添加一個子進程…..等500個子進程都執行完了,再執行print “test”。(從結果來看,并沒有多進程并發)

總結

以上是生活随笔為你收集整理的python3多进程 pool manager_Python多进程multiprocessing.Pool的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。