一連のファイルに対して並行して実行したい一連のコマンド ライン ツールがあります。次のようなものをラップするための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
ただし、マップ呼び出しは、明らかに成功した後に時々 (常に?) ハングします。