中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python多進程multiprocessing包有哪些工具

發布時間:2021-11-19 15:07:54 來源:億速云 閱讀:200 作者:iii 欄目:編程語言

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

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

進程池

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

“三個進程的進程池”

比如下面的程序:

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)

我們創建了一個容許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對象這么做。

共享內存

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

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

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

到此,關于“Python多進程multiprocessing包有哪些工具”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

烟台市| 论坛| 中方县| 泰兴市| 罗江县| 洪洞县| 蒙自县| 渝北区| 兴化市| 手机| 德清县| 南投县| 连平县| 北辰区| 双柏县| 无为县| 抚远县| 台前县| 新晃| 石首市| 咸宁市| 隆子县| 抚宁县| 和顺县| 翁牛特旗| 珲春市| 喀什市| 板桥市| 定结县| 犍为县| 西林县| 临沂市| 平定县| 丘北县| 镇坪县| 句容市| 嘉义县| 南城县| 台中县| 永泰县| 彭阳县|