这不是我的实际程序,但是它说明了我的问题。这是代码:
import multiprocessing as mp
import subprocess
import random
O = open("test.txt","w")
for i in range(10000000):
O.write("%s\n" % (random.randint(0,9)))
O.close()
def worker(number):
subprocess.call("awk \'$1==%s\' test.txt> test.%s.txt" % (number,number),shell=True)
return number
pool = mp.Pool(processes=3)
results = [pool.apply(worker, args=(x,)) for x in range(10)]
print(results)
此代码运行良好,但是我注意到awk命令按顺序执行,而不是一次执行3。有什么我想念的吗?
答案 0 :(得分:2)
multiprocessing.Pool.apply
...
阻止,直到结果准备好为止。在这种情况下,
apply_async()
更适合并行执行工作。
如果您的核心工作确实涉及启动子流程而不是在Python中进行本机工作,那么您也可以考虑在单个Python进程中直接启动一堆subprocess.Popen
对象,然后poll()
和{{ 3}}。这样可以节省一层流程,但是如果子流程正在向自己的stdout编写内容,则收集这些子流程的输出可能会更加棘手。