Python多進(jìn)程multiprocessing包有哪些工具-創(chuàng)新互聯(lián)

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

創(chuàng)新互聯(lián)專注于宣恩網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供宣恩營銷型網(wǎng)站建設(shè),宣恩網(wǎng)站制作、宣恩網(wǎng)頁設(shè)計(jì)、宣恩網(wǎng)站官網(wǎng)定制、成都小程序開發(fā)服務(wù),打造宣恩網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供宣恩網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

在 初步了解Python多進(jìn)程之后,我們可以繼續(xù)探索multiprocessing包中更加高級的工具。這些工具可以讓我們更加便利地實(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)程會被用于重新運(yùn)行f()函數(shù)。除了map()方法外,Pool還有下面的常用方法。

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

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

join()   wait進(jìn)程池中的全部進(jìn)程。必須對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)站的首頁。(你可以使用subprocess調(diào)用wget或者curl等下載工具執(zhí)行具體的下載任務(wù))

共享資源

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

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

Manager

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

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就允許我們共享更多樣的對象。

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

網(wǎng)頁題目:Python多進(jìn)程multiprocessing包有哪些工具-創(chuàng)新互聯(lián)
URL分享:http://www.muchs.cn/article28/dsoecp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、網(wǎng)站設(shè)計(jì)公司、定制開發(fā)、網(wǎng)站改版、建站公司手機(jī)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)