[英]subprocess + multiprocessing - multiple commands in sequence
我有一組命令行工具,它們希望在一系列文件上並行運行。 我寫了一個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
而類似的調用,使用map
代替apply
(但沒有傳遞kwds
任何規定)看起來更像
pid
pid
pid
finish
finish
finish
但是,地圖調用有時(總是?)有時在顯然成功之后掛起
Popen
的調用是否在“阻止”?
否。僅創建一個subprocess.Popen
立即返回,為您提供一個可以等待或以其他方式使用的對象。 如果要阻止,這很簡單:
subprocess.check_call(shlex.split(cmd1))
同時,我不確定為什么要將args組合成一個字符串,然后嘗試將其shlex
為列表。 為什么不只寫清單呢?
cmd1 = ["echo", fn]
subprocess.check_call(cmd1)
盡管此方法有效,但似乎並沒有運行多個進程。 似乎只是串行運行
是什么讓你覺得呢? 鑒於每個進程只是盡可能快地將兩個進程啟動到后台,因此很難判斷它們是否並行運行。
如果要驗證您是否正在通過多個處理工作,則可能需要添加一些打印件或記錄(並將諸如os.getpid()
之類的消息放入消息中)。
同時,它看起來像你想完全復制的效果multiprocessing.Pool.map_async
出圍繞循環multiprocessing.Pool.apply_async
,只是不用積累你積攢每一個變量中稱結果RESULT
和然后將其丟棄,然后再使用。 為什么不只使用map_async
?
最后,您詢問multiprocessing
是否是適合該工作的工具。 好吧,您顯然需要異步的東西: check_call(args(file1))
必須阻止other_python_function_to_do_something_to_file(file1)
,但同時不要阻止check_call(args(file2))
。
我可能會使用threading
,但是,實際上並沒有太大的區別。 即使您在一個進程啟動成本很高的平台上,您也已經為此付出了代價,因為整個過程運行着N * M個子進程,因此另外8個子進程不會對任何事情造成傷害。 由於沒有共享的余地,因此很少有可能通過在線程之間共享數據而意外地創建競爭,或者意外地創建了看起來像在不共享的進程之間共享數據的代碼那樣的風險。 因此,無論您喜歡哪個,都去爭取。
另一種選擇是編寫一個事件循環。 我可能實際上會開始自己解決這個問題,但我對此感到后悔,而您不應該這樣做……
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.