我有一组命令行工具,我想在一系列文件上并行运行。我编写了一个 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
但是,地图调用有时(总是?)在显然成功后挂起