python的高階程式設計 之程序

2021-06-28 14:41:18 字數 2764 閱讀 6216

2023年02月26日

⁄ 綜合⁄ 共 2288字 ⁄ 字型大小

小 中 大

初步了解python多程序

之後,我們可以繼續探索multiprocessing包中更加高階的工具。這些工具可以讓我們更加便利地實現多程序。

1. 程序池

之前我們使用process建立程序的時候,每次建立乙個程序。程序池 (process pool) 建立多個程序。這些程序就像是隨時待命的士兵,準備執行任務(程式

)。乙個程序池中可以容納多個待命的士兵。

比如下面的程式:

import

multiprocessing as mul

deff(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還有下面的常用方法。

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

2. 共享資源

我們在python多程序初步已經提到,我們應該盡量避免多程序共享資源。多程序共享資源必然會帶來程序間相互競爭。而這種競爭又會造成race condition,我們的結果有可能被競爭的不確定性所影響。但如果需要,我們依然可以通過共享記憶體和manager物件這麼做。

1) 共享記憶體

在linux程序間通訊中,我們已經講述了共享記憶體(shared memory)的原理,這裡給出用python實現的例子: #

modified from official documentation

import

multiprocessing

deff(n, a):

n.value   = 3.14a[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.value

print arr[:]

這裡我們實際上只有主程序和process物件代表的程序。我們在主程序的記憶體空間中建立共享的記憶體,也就是value和array兩個物件。物件value被設定成為雙精度數(d), 並初始化為0.0。而array則類似於c中的陣列,有固定的型別(i, 也就是整數)。在process程序中,我們修改了value和array物件。回到主程式,列印出結果,主程式也看到了兩個物件的改變,說明資源確實在兩個程序之間共享。

2)manager

manager物件類似於伺服器與客戶之間的通訊 (server-client),與我們在internet上的活動很類似。我們用乙個程序作為伺服器,建立manager來真正存放資源。其它的程序可以通過引數傳遞或者根據位址來訪問manager,建立連線後,操作伺服器上的資源。在防火牆允許的情況下,我們完全可以將manager運用於多計算機,從而模仿了乙個真實的網路情境。下面的例子中,我們對manager的使用類似於shared memory,但可以共享更豐富的物件型別。

import

multiprocessing

deff(x, arr, l):

'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

python高階程式設計之程序

乙個正在執行的程式或軟體就是乙個程序,是作業系統進行資源分配的基本單位 乙個程式執行後至少有乙個程序,乙個程序預設有乙個執行緒,執行緒依賴程序。process group target name args kwargs group 指定程序組,目前只能使用none target 執行的目標任務名 n...

高階程式設計之程序(二)

進 程 1 程序的退出 return 只有在main函式中執行才能將程序退出。exit 程序退出函式,會自動重新整理快取區。exit 強制退出程序,不會重新整理快取區。2 特殊程序 2.1 孤兒程序 父程序退出,而子程序單獨存在。子程序變成孤兒程序。2.2 殭屍程序 父程序存在,子程序退出。父程序沒...

Linuxc高階程式設計之程序1

1.列印當前所有環境變數的值 2.新增新的環境變數newenv first 3.修改環境變數newenv的值為second 4.列印環境變數newenv的值。源 include include include extern char environ int main int argc,char ar...