最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python標(biāo)準(zhǔn)庫(kù)之多進(jìn)程(multiprocessing包)介紹

 更新時(shí)間:2014年11月25日 10:27:50   投稿:junjie  
這篇文章主要介紹了Python標(biāo)準(zhǔn)庫(kù)之多進(jìn)程(multiprocessing包)介紹,本文講解了進(jìn)程池、共享資源、共享內(nèi)存、Manager等內(nèi)容,需要的朋友可以參考下

在初步了解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)程池”

比如下面的程序:

復(fù)制代碼 代碼如下:

import multiprocessing as mul
def f(x):
    return x**2
pool = 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。

復(fù)制代碼 代碼如下:

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

共享“資源”

共享內(nèi)存

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

復(fù)制代碼 代碼如下:

# modified from official documentation
import multiprocessing
def f(n, a):
    n.value   = 3.14
    a[0]      = 5
num   = 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.value
print 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ì)象的改變,說(shuō)明資源確實(shí)在兩個(gè)進(jìn)程之間共享。

Manager

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

復(fù)制代碼 代碼如下:

import multiprocessing
def 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()來(lái)共享詞典,Lock()來(lái)共享threading.Lock(注意,我們共享的是threading.Lock,而不是進(jìn)程的mutiprocessing.Lock。后者本身已經(jīng)實(shí)現(xiàn)了進(jìn)程共享)等。 這樣Manager就允許我們共享更多樣的對(duì)象。

我們?cè)谶@里不深入講解Manager在遠(yuǎn)程情況下的應(yīng)用。有機(jī)會(huì)的話,會(huì)在網(wǎng)絡(luò)應(yīng)用中進(jìn)一步探索。

總結(jié)

Pool
Shared memory, Manager

相關(guān)文章

最新評(píng)論

德令哈市| 玉环县| 临高县| 句容市| 定安县| 唐山市| 永春县| 东乡族自治县| 望江县| 万全县| 腾冲县| 延长县| 崇仁县| 靖州| 太谷县| 大城县| 罗平县| 登封市| 炉霍县| 岱山县| 施甸县| 蚌埠市| 江口县| 达尔| 大安市| 平潭县| 四会市| 卢湾区| 堆龙德庆县| 大姚县| 城口县| 铅山县| 延安市| 保定市| 铜陵市| 沾化县| 长阳| 开远市| 清新县| 蒙山县| 赤水市|