溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python多進(jìn)程multiprocessing包有哪些工具

發(fā)布時(shí)間:2021-11-19 15:07:54 來源:億速云 閱讀:200 作者:iii 欄目:編程語(yǔ)言

這篇文章主要介紹“Python多進(jìn)程multiprocessing包有哪些工具”,在日常操作中,相信很多人在Python多進(jìn)程multiprocessing包有哪些工具問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Python多進(jìn)程multiprocessing包有哪些工具”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

在 初步了解Python多進(jìn)程之后,我們可以繼續(xù)探索multiprocessing包中更加高級(jí)的工具。這些工具可以讓我們更加便利地實(shí)現(xiàn)多進(jìn)程。

進(jìn)程池

進(jìn)程池 (Process Pool)可以創(chuàng)建多個(gè)進(jìn)程。這些進(jìn)程就像是隨時(shí)待命的士兵,準(zhǔn)備執(zhí)行任務(wù)(程序)。一個(gè)進(jìn)程池中可以容納多個(gè)待命的士兵。

“三個(gè)進(jìn)程的進(jìn)程池”

比如下面的程序:

import multiprocessing as muldef f(x):    return x**2pool = mul.Pool(5)
rel  = pool.map(f,[1,2,3,4,5,6,7,8,9,10])
print(rel)

我們創(chuàng)建了一個(gè)容許5個(gè)進(jìn)程的進(jìn)程池 (Process Pool) 。Pool運(yùn)行的每個(gè)進(jìn)程都執(zhí)行f()函數(shù)。我們利用map()方法,將f()函數(shù)作用到表的每個(gè)元素上。這與 built-in的map()函數(shù)類似,只是這里用5個(gè)進(jìn)程并行處理。如果進(jìn)程運(yùn)行結(jié)束后,還有需要處理的元素,那么的進(jìn)程會(huì)被用于重新運(yùn)行f()函數(shù)。除了map()方法外,Pool還有下面的常用方法。

apply_async(func,args)  從進(jìn)程池中取出一個(gè)進(jìn)程執(zhí)行func,args為func的參數(shù)。它將返回一個(gè)AsyncResult的對(duì)象,你可以對(duì)該對(duì)象調(diào)用get()方法以獲得結(jié)果。

close()  進(jìn)程池不再創(chuàng)建新的進(jìn)程

join()   wait進(jìn)程池中的全部進(jìn)程。必須對(duì)Pool先調(diào)用close()方法才能join。

練習(xí)

有下面一個(gè)文件download.txt。

www.sina.com.cn
www.163.com
www.iciba.com
www.cnblogs.com
www.qq.com
www.douban.com

使用包含3個(gè)進(jìn)程的進(jìn)程池下載文件中網(wǎng)站的首頁(yè)。(你可以使用subprocess調(diào)用wget或者curl等下載工具執(zhí)行具體的下載任務(wù))

共享資源

我們?cè)? Python多進(jìn)程初步已經(jīng)提到,我們應(yīng)該盡量避免多進(jìn)程共享資源。多進(jìn)程共享資源必然會(huì)帶來進(jìn)程間相互競(jìng)爭(zhēng)。而這種競(jìng)爭(zhēng)又會(huì)造成race condition,我們的結(jié)果有可能被競(jìng)爭(zhēng)的不確定性所影響。但如果需要,我們依然可以通過共享內(nèi)存和Manager對(duì)象這么做。

共享內(nèi)存

在 Linux進(jìn)程間通信中,我們已經(jīng)講述了共享內(nèi)存(shared memory)的原理,這里給出用Python實(shí)現(xiàn)的例子:

# modified from official documentationimport multiprocessingdef f(n, a):
    n.value   = 3.14
    a[0]      = 5num   = multiprocessing.Value('d', 0.0)
arr   = multiprocessing.Array('i', range(10))
p = multiprocessing.Process(target=f, args=(num, arr))
p.start()
p.join()print num.valueprint arr[:]

這里我們實(shí)際上只有主進(jìn)程和Process對(duì)象代表的進(jìn)程。我們?cè)谥鬟M(jìn)程的內(nèi)存空間中創(chuàng)建共享的內(nèi)存,也就是Value和Array兩個(gè)對(duì)象。對(duì)象Value被設(shè)置成為雙精度數(shù)(d), 并初始化為0.0。而Array則類似于C中的數(shù)組,有固定的類型(i, 也就是整數(shù))。在Process進(jìn)程中,我們修改了Value和Array對(duì)象?;氐街鞒绦?,打印出結(jié)果,主程序也看到了兩個(gè)對(duì)象的改變,說明資源確實(shí)在兩個(gè)進(jìn)程之間共享。

Manager

Manager對(duì)象類似于服務(wù)器與客戶之間的通信 (server-client),與我們?cè)贗nternet上的活動(dòng)很類似。我們用一個(gè)進(jìn)程作為服務(wù)器,建立Manager來真正存放資源。其它的進(jìn)程可以通過參數(shù)傳遞或者根據(jù)地址來訪問Manager,建立連接后,操作服務(wù)器上的資源。在防火墻允許的情況下,我們完全可以將Manager運(yùn)用于多計(jì)算機(jī),從而模仿了一個(gè)真實(shí)的網(wǎng)絡(luò)情境。下面的例子中,我們對(duì)Manager的使用類似于shared memory,但可以共享更豐富的對(duì)象類型。

import multiprocessingdef f(x, arr, l):
    x.value = 3.14
    arr[0] = 5
    l.append('Hello')
server = multiprocessing.Manager()
x    = server.Value('d', 0.0)
arr  = server.Array('i', range(10))
l    = server.list()
proc = multiprocessing.Process(target=f, args=(x, arr, l))
proc.start()
proc.join()print(x.value)print(arr)print(l)

Manager利用list()方法提供了表的共享方式。實(shí)際上你可以利用dict()來共享詞典,Lock()來共享threading.Lock(注意,我們共享的是threading.Lock,而不是進(jìn)程的mutiprocessing.Lock。后者本身已經(jīng)實(shí)現(xiàn)了進(jìn)程共享)等。 這樣Manager就允許我們共享更多樣的對(duì)象。

到此,關(guān)于“Python多進(jìn)程multiprocessing包有哪些工具”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI