Python多处理不并行执行

Python多处理不并行执行,python,multiprocessing,Python,Multiprocessing,这不是我的实际计划,但它说明了我的问题。代码如下: 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\' t

这不是我的实际计划,但它说明了我的问题。代码如下:

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 COMMANND是按顺序执行的,而不是一次执行3个。有什么我遗漏的吗?

阻塞,直到结果就绪。考虑到这一块,它更适合并行执行工作

如果你的核心工作真的涉及启动子进程而不是在Python中进行本地工作,那么你也可以考虑只在一个Python进程中直接启动一堆对象,然后在每个Python进程上进行。这节省了一层进程,但如果子进程正在将内容写入自己的标准输出,则收集子进程的输出可能要复杂得多。

阻塞,直到结果就绪。考虑到这一块,它更适合并行执行工作


如果你的核心工作真的涉及启动子进程而不是在Python中进行本地工作,那么你也可以考虑只在一个Python进程中直接启动一堆对象,然后在每个Python进程上进行。这节省了一层进程,但如果子进程正在将内容写入自己的标准输出,则收集子进程的输出可能会更加困难。

如果输入和输出可以按顺序处理,则
Pool.map
或Pool.imap\u unordered`可能是更好的选择,
apply\u async
。另外,使用
多处理.dummy
可能比滚动您自己的子进程启动器要好。如果输入和输出可以按顺序处理,那么
Pool.map
或Pool.imap\u unordered`可能是更好的选择,
apply\u async
。另外,使用
multiprocessing.dummy
可能比使用自己的子流程启动器要好。