Python 子流程和多流程模块的组合

Python 子流程和多流程模块的组合,python,python-2.7,subprocess,multiprocess,Python,Python 2.7,Subprocess,Multiprocess,我正在制作一个小管道,用于处理大量数据,我决定使用python使用多核调用该程序 下面是我的问题: 1) 程序输出一个非常大的文本文件。我只希望将输出保存到一个新文件中(所以不要将字符串保存为python对象),使用subprocess模块执行此操作的最佳方法是什么 2) 我希望使用多进程模块多次并行调用该程序。我通常只是简单地使用Pool.map函数,这会干扰子流程模块吗 提前谢谢 1) 程序输出一个非常大的文本文件。我只希望将输出保存到一个新文件中(所以不要将字符串保存为python对象),

我正在制作一个小管道,用于处理大量数据,我决定使用python使用多核调用该程序

下面是我的问题:

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

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

提前谢谢

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

如果查看,
stdout
的有效值为:

管道、现有文件描述符(正整数)、现有文件对象和无

因此:


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

除非你做了一些奇怪的事情

multiprocessing.Pool
跟踪它创建了哪些进程,并且不会尝试管理碰巧在其他地方创建的其他子进程,因此您担心的显然不是问题

我所看到的最常见的问题是使用
Popen
创建从未收获的子进程。在没有
多处理
的应用程序中,您通常可以侥幸逃脱,但一旦您执行了
Popen
-并泄漏到池任务中,您就不再侥幸逃脱。(这实际上与
多处理
或Python无关;只是孙子进程与子进程不同。)

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

如果查看,
stdout
的有效值为:

管道、现有文件描述符(正整数)、现有文件对象和无

因此:


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

除非你做了一些奇怪的事情

multiprocessing.Pool
跟踪它创建了哪些进程,并且不会尝试管理碰巧在其他地方创建的其他子进程,因此您担心的显然不是问题


我所看到的最常见的问题是使用
Popen
创建从未收获的子进程。在没有
多处理
的应用程序中,您通常可以侥幸逃脱,但一旦您执行了
Popen
-并泄漏到池任务中,您就不再侥幸逃脱。(这实际上与
多处理
或Python无关;只是孙子进程与子进程不同。)

谢谢你的回答。您使用
和open
有什么特别的原因吗?@误解:当您使用
和open
时,您几乎应该总是使用
。否则,您需要一些其他方法来保证无论发生什么情况都能调用
outfile.close()
,即使是在异常或提前返回或其他情况下。(特别是对于可写文件,如果无法关闭文件,可能意味着最后几行无法进入磁盘。)在这种情况下……确实没有风险,但即使在这里,也可以节省一些按键,这意味着我不必考虑是否有风险。谢谢你的回答。您使用
和open
有什么特别的原因吗?@误解:当您使用
和open
时,您几乎应该总是使用
。否则,您需要一些其他方法来保证无论发生什么情况都能调用
outfile.close()
,即使是在异常或提前返回或其他情况下。(特别是对于可写文件,无法关闭文件可能意味着最后几行无法进入磁盘。)在这种特殊情况下……确实没有风险,但即使在这里,它也可以节省一些按键,这意味着我不必考虑是否有风险。
with open('new_file.txt', 'w') as outfile:
    subprocess.call(['program', 'arg'], stdout=outfile)