亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python標準庫之多進程(multiprocessing包)介紹

系統 1757 0

在初步了解Python多進程之后,我們可以繼續探索multiprocessing包中更加高級的工具。這些工具可以讓我們更加便利地實現多進程。

進程池

進程池 (Process Pool)可以創建多個進程。這些進程就像是隨時待命的士兵,準備執行任務(程序)。一個進程池中可以容納多個待命的士兵。

Python標準庫之多進程(multiprocessing包)介紹_第1張圖片

“三個進程的進程池”

比如下面的程序:

復制代碼 代碼如下:

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)

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

apply_async(func,args)? 從進程池中取出一個進程執行func,args為func的參數。它將返回一個AsyncResult的對象,你可以對該對象調用get()方法以獲得結果。

close()? 進程池不再創建新的進程

join()?? wait進程池中的全部進程。必須對Pool先調用close()方法才能join。

練習

有下面一個文件download.txt。

復制代碼 代碼如下:

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

使用包含3個進程的進程池下載文件中網站的首頁。(你可以使用subprocess調用wget或者curl等下載工具執行具體的下載任務)

共享資源

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

Python標準庫之多進程(multiprocessing包)介紹_第2張圖片

共享“資源”

共享內存

在Linux進程間通信中,我們已經講述了共享內存(shared memory)的原理,這里給出用Python實現的例子:

復制代碼 代碼如下:

# 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[:]

這里我們實際上只有主進程和Process對象代表的進程。我們在主進程的內存空間中創建共享的內存,也就是Value和Array兩個對象。對象Value被設置成為雙精度數(d), 并初始化為0.0。而Array則類似于C中的數組,有固定的類型(i, 也就是整數)。在Process進程中,我們修改了Value和Array對象。回到主程序,打印出結果,主程序也看到了兩個對象的改變,說明資源確實在兩個進程之間共享。

Manager

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

復制代碼 代碼如下:

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()方法提供了表的共享方式。實際上你可以利用dict()來共享詞典,Lock()來共享threading.Lock(注意,我們共享的是threading.Lock,而不是進程的mutiprocessing.Lock。后者本身已經實現了進程共享)等。 這樣Manager就允許我們共享更多樣的對象。

我們在這里不深入講解Manager在遠程情況下的應用。有機會的話,會在網絡應用中進一步探索。

總結

Pool
Shared memory, Manager


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲国产精品一区二区第四页 | 欧美色域 | 成人在线观看国产 | 久久久久久夜精品精品免费 | 亚洲成人福利在线 | 韩国精品欧美一区二区三区 | 国产成人午夜精品影院游乐网 | 香蕉视频在线视频 | 欧美理论在线观看 | 日本草草影院 | 天天弄| 国产精品日韩欧美一区二区三区 | 九九99热久久精品在线9 | 成年人国产网站 | 国语偷拍视频在线观看 | 久久精品综合一区二区三区 | 欧美亚洲国产一区二区三区 | 亚洲一区日韩二区欧美三区 | 华人亚洲欧美精品国产 | 国产福利在线观看 | 九九热re| 性欧美日韩 | 欧美成人精品高清在线观看 | 久热久| 亚洲日本一区二区三区在线不卡 | 四虎影视库永久在线地址 | 1级毛片 | 亚洲美女网址 | 精品国产免费久久久久久婷婷 | 欧美黄色网页 | 私人影院在线免费观看 | 四虎最新免费观看网址 | 日本大胆一区免费视频 | 国产小视频在线观看www | 国内视频在线 | 色综合欧美综合天天综合 | 亚洲欧美日韩中字综合 | 91孕妇精品一区二区三区 | 午夜国产精品影院在线观看 | 香蕉亚洲精品一区二区 | 欧美亚洲h在线一区二区 |