我有一組命令行工具,我想在一系列文件中並行運行。我寫了一個Python函數來包裝他們,看起來是這樣的:子進程+多處理 - 順序執行多個命令
def process_file(fn):
print os.getpid()
cmd1 = "echo "+fn
p = subprocess.Popen(shlex.split(cmd1))
# after cmd1 finishes
other_python_function_to_do_something_to_file(fn)
cmd2 = "echo "+fn
p = subprocess.Popen(shlex.split(cmd2))
print "finish"
if __name__=="__main__":
import multiprocessing
p = multiprocessing.Pool()
for fn in files:
RETURN = p.apply_async(process_file,args=(fn,),kwds={some_kwds})
雖然這個工作,它似乎並沒有在運行多個進程;它似乎只是在串行運行(我嘗試使用Pool(5)
具有相同的結果)。我錯過了什麼?是否撥打Popen
「阻止」?
編輯:澄清一點。我需要cmd1,然後是一些python命令,然後是cmd2,在每個文件上依次執行。
EDIT2:從上述輸出具有圖案:
pid
finish
pid
finish
pid
finish
而類似呼叫,代替apply
使用map
(但沒有任何規定用於使kwds
)看起來更像
pid
pid
pid
finish
finish
finish
但是,地圖調用有時(總是?)掛起後顯然成功
在回答這個問題之前......爲什麼你需要'多處理器'?你可以在一個進程中創建一大堆'Popen'實例,它們就像在多個進程中創建它們一樣。 – abarnert
那麼,這是我的問題的一部分(所以謝謝你幫我澄清)...我的shell命令需要連續運行(即,cmd1,cmd2,cmd3)。我希望每個*系列*在每個文件上執行。 – keflavich
@abarnert是對的。只是不要在流程中調用「溝通」或「等待」 – JBernardo