结合子进程和多进程模块

时间:2013-09-25 17:57:40

标签: python python-2.7 subprocess multiprocess

我正在制作一个用于咀嚼大量数据的小型管道,我决定使用python来使用多个内核调用该程序。

所以这是我的问题:

1)程序输出一个非常大的文本文件。我只希望将输出保存到一个新文件(所以不要将字符串保存为python对象),使用子进程模块执行此操作的最佳方法是什么?

2)我希望使用多进程模块并行多次调用该程序。我通常只是采用简单的方式并使用Pool.map函数,这会干扰子进程模块吗?

提前致谢!

1 个答案:

答案 0 :(得分:3)

  

1)程序输出一个非常大的文本文件。我只希望将输出保存到一个新文件(所以不要将字符串保存为python对象),使用子进程模块执行此操作的最佳方法是什么?

如果查看the documentationstdout的有效值为:

  

PIPE,现有文件描述符(正整数),现有文件对象和无。

所以:

with open('new_file.txt', 'w') as outfile:
    subprocess.call(['program', 'arg'], stdout=outfile)

  

2)我希望使用多进程模块并行多次调用该程序。我通常只是采用简单的方式并使用Pool.map函数,这会干扰子进程模块吗?

除非你做某些奇怪的事情。

multiprocessing.Pool会跟踪它创建的进程,并且不会尝试管理碰巧在其他地方创建的其他子进程,因此您担心的显而易见的事情不是问题。

我见过的最常见问题是使用Popen来创建您永远无法获得的子进程。你经常会在没有multiprocessing的应用中侥幸逃脱,但是一旦你在游​​泳池任务中执行Popen - 泄漏,你就会停止使用它。 (这与multiprocessing或Python无关;它只是孙子进程与子进程不同。)