1

我有一個Linux機器4 cpu。多重處理Python

我有一個長期運行的程序,我需要在1024個主機上同時執行並獲得結果。

ipArrayList -> Contains list of host ips. 

以下程序運行良好,但需要很長的時間,有時它掛起天:

import multiprocessing 

pool = multiprocessing.Pool(100) 
pool.map(long_running_module,ipArrayList) 
pool.close() 
pool.join() 

以下程序只在更少的輸入(ipArrayList的尺寸)的情況下的運行速度更快。如果IP地址在ipArray列表中的號碼是巨大的,然後有時候我碰到緩衝空間的問題。([錯誤105]沒有可用的緩衝空間)

job = [] 
for ip in ipArrayList: 
    p = multiprocessing.Process(target=long_running_module, args=(ip)) 
    job.append(p) 
    p.start() 

for j in job: 
    j.join() 

的long_run_module通過ssh連接到每個在ipArrayList的ip(的paramiko)。它在主機內進行一些長時間運行計算,然後將結果返回到同步列表。

請幫助我有效地編程。

+0

我懷疑當你溢出參數緩衝區時,雖然我不確定。嘗試在列表中發送:'multiprocessing.Process(target = long_running_module,args =(ipArray,))'。確保在處理過程中期待列表。 –

+2

爲什麼4個CPU上有100個池? –

+0

建議:使用https://www.gnu.org/software/parallel/ –

回答

1

我同意使用pool並不是最好的,如果你只有4個內核,你可以使用「map」功能代替,看看this

map(f, S) 

˚F是一個函數,它有一個參數和返回值。

S是任何可迭代的。

>>> def add100(x): 
...  return x+100 
... 
>>> map(add100, (44,22,66)) 
[144, 122, 166] 

但是,因爲你需要1024臺主機同時執行並得到結果後,我強烈建議你使用分佈式平臺。 Python中有一些但是SCOOP有很好的記錄和維護。

+0

感謝您的建議。 – May

+0

不客氣。 – epinal