同时在 Python 中运行多个独立的进程。

12

我使用Python的'multiprocessing'模块在多个核心上运行单个进程,但我希望能够并行运行几个独立的进程。例如,第一个进程解析大文件,第二个进程在不同的文件中查找模式,第三个进程则进行一些计算;这三个具有不同参数集的不同进程是否可以并行运行?

def Process1(largefile):
    Parse large file
    runtime 2hrs
    return parsed_file

def Process2(bigfile)
    Find pattern in big file
    runtime 2.5 hrs
    return pattern

def Process3(integer)
    Do astronomical calculation
    Run time 2.25 hrs
    return calculation_results

def FinalProcess(parsed,pattern,calc_results):
    Do analysis
    Runtime 10 min
    return final_results

def main():
parsed = Process1(largefile)
pattern = Process2(bigfile)
calc_res = Process3(integer)
Final = FinalProcess(parsed,pattern,calc_res)

if __name__ == __main__:
    main()
    sys.exit()
在上面的伪代码Process1、Process2和Process3是单核进程,即它们不能在多个处理器上运行。这些进程按顺序运行,需要2+2.5+2.25小时=6.75小时。是否可能并行运行这三个进程?使它们在不同的处理器/核上同时运行,并且当最费时间的(Process2)完成后,再运行最终进程。

你看过 subprocess 模块吗? - Tim Peters
你可能想要创建一个线程或子进程来进行数据处理。线程文档请参考:http://docs.python.org/2/library/threading.html,子进程文档请参考:http://docs.python.org/2/library/subprocess.html。 - Emmett Butler
1
@Emmett,他除非使用Jython、IronPython或其他跳过GIL的东西,否则就不能使用线程。 - planestepper
1
啊,@leon说得很好。由于GIL的存在,每个核心运行一个线程仍然需要与串行运行所有这些进程相同的时间。 - Emmett Butler
1
@Emmet,是的...这是一个强大的弱点。 - planestepper
1个回答

26

来自16.6.1.5. 使用工作进程池

from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    pool = Pool(processes=4)              # start 4 worker processes
    result = pool.apply_async(f, [10])    # evaluate "f(10)" asynchronously
    print result.get(timeout=1)           # prints "100" unless your computer is *very* slow
    print pool.map(f, range(10))          # prints "[0, 1, 4,..., 81]"

因此,您可以针对池使用apply_async,并在所有准备就绪后获取结果。

from multiprocessing import Pool

# all your methods declarations above go here
# (...)

def main():
    pool = Pool(processes=3)
    parsed = pool.apply_async(Process1, [largefile])
    pattern = pool.apply_async(Process2, [bigfile])
    calc_res = pool.apply_async(Process3, [integer])

    pool.close()
    pool.join()

    final = FinalProcess(parsed.get(), pattern.get(), calc_res.get())

# your __main__ handler goes here
# (...)

@Ieon 对不起,我的错。 - Sabito stands with Ukraine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接