我正在制作一个用于咀嚼大量数据的小型管道,我决定使用python来使用多个内核调用该程序。
所以这是我的问题:
1)程序输出一个非常大的文本文件。我只希望将输出保存到一个新文件(所以不要将字符串保存为python对象),使用子进程模块执行此操作的最佳方法是什么?
2)我希望使用多进程模块并行多次调用该程序。我通常只是采用简单的方式并使用Pool.map函数,这会干扰子进程模块吗?
提前致谢!
答案 0 :(得分:3)
1)程序输出一个非常大的文本文件。我只希望将输出保存到一个新文件(所以不要将字符串保存为python对象),使用子进程模块执行此操作的最佳方法是什么?
如果查看the documentation,stdout
的有效值为:
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无关;它只是孙子进程与子进程不同。)