这不是我的实际程序,但它说明了我的问题。这是代码:
import multiprocessing as mp
import subprocess
import random
O = open("test.txt","w")
for i in range(10000000):
O.write("%sn" % (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个。我缺了什么吗?
multiprocessing.Pool.apply
。。。
块,直到结果准备好。给定这些块,
apply_async()
更适合并行执行工作。
如果您的核心工作真的涉及启动子流程,而不是在Python中以本机方式进行工作,那么您也可以考虑在单个Python流程中直接启动一堆subprocess.Popen
对象,然后在每个对象上分别启动poll()
和wait()
。这节省了一层流程,但如果子流程将内容写入自己的stdout,则收集子流程的输出可能会更加困难。