您好,登錄后才能下訂單哦!
這篇文章主要介紹“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)程池 (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í)用的文章!
免責(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)容。