[英]Using multiprocessing pool of workers
我編寫了以下代碼,以使我的第二個CPU核心工作。 代碼基本上做的是首先在目錄層次結構中找到所需的“海”文件,然后執行外部腳本集來處理這些二進制“海”文件,以生成50到100個文本和二進制文件。 由於問題的標題以平行的方式提出,以提高處理速度。
這個問題起源於我們在IPython用戶列表中長期討論的標題為“ 無法啟動ipcluster ”。 從我對IPython並行處理功能的實驗開始。
問題是我無法正常運行此代碼。 如果包含“sea”文件的文件夾僅包含“sea”文件,則腳本將在不完全執行外部腳本運行的情況下完成其執行。 (假設我有30-50個外部腳本要運行,但是我的多處理啟用腳本只有在執行這些外部腳本鏈中的第一個腳本后才會耗盡。)有趣的是,如果我在已處理的文件夾(即“海”文件)上運行此腳本預先處理並且輸出文件已經在該文件夾中)然后它運行,但是這次我的速度提升到大約2.4到2.7X,相對於線性處理時序。 由於筆記本電腦中只有Core 2 Duo 2.5 Ghz CPU,因此不是很理想。 雖然我有一個CUDA驅動的GPU,但它與我目前的並行計算難度無關:)
您認為這個問題的來源是什么?
感謝您的所有意見和建議。
#!/usr/bin/env python
from multiprocessing import Pool
from subprocess import call
import os
def find_sea_files():
file_list, path_list = [], []
init = os.getcwd()
for root, dirs, files in os.walk('.'):
dirs.sort()
for file in files:
if file.endswith('.sea'):
file_list.append(file)
os.chdir(root)
path_list.append(os.getcwd())
os.chdir(init)
return file_list, path_list
def process_all(pf):
os.chdir(pf[0])
call(['postprocessing_saudi', pf[1]])
if __name__ == '__main__':
pool = Pool(processes=2) # start 2 worker processes
files, paths = find_sea_files()
pathfile = [[paths[i],files[i]] for i in range(len(files))]
pool.map(process_all, pathfile)
我首先要對工作流程的情況有一個更好的感覺。 如果需要,多處理模塊會為其子進程記錄日志。 由於您已經簡化了代碼以縮小問題范圍,我只需要使用一些打印語句進行調試,就像這樣(或者您可以使用PrettyPrint pf數組):
def process_all(pf):
print "PID: ", os.getpid()
print "Script Dir: ", pf[0]
print "Script: ", pf[1]
os.chdir(pf[0])
call(['postprocessing_saudi', pf[1]])
if __name__ == '__main__':
pool = Pool(processes=2)
files, paths = find_sea_files()
pathfile = [[paths[i],files[i]] for i in range(len(files))]
pool.map(process_all, pathfile, 1) # Ensure the chunk size is 1
pool.close()
pool.join()
我用2.6.4完成的Python版本。
有幾件事我能想到:
1)你打印出了路徑文件嗎? 你確定它們都是正確生成的嗎?
a)我問你的os.walk有點有趣; dirs.sort()應該沒問題,但似乎非常不合時宜。 一般不應使用os.chdir(); 恢復應該沒問題 ,但一般來說你應該只是將root添加到init。
2)我已經看到python2.6上的多處理有問題從池中產生subporcesses。 (我特意讓一個腳本使用多處理來產生子進程。那些子進程然后無法正確使用多處理(池被鎖定))。 嘗試使用python2.5 w / mulitprocessing backport。
3)嘗試picloud的cloud.mp模塊(包裝多處理,但處理池有點不同),看看是否有效。
你會的
cloud.mp.join(cloud.mp.map(process_all, pathfile))
(免責聲明:我是PiCloud的開發者之一)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.