没有通信的Python Popen流程更快完成

时间:2014-01-10 05:21:33

标签: python subprocess multiprocessing

我不完全确定原因,但我基本上想要运行2个进程,所以我使用子进程Popen函数。

commands = ['command 1', 'command 2']
for command in commands:
    proc = Popen(command.split(' '))
    proc.communicate()       # line of interest

命令是渲染过程,因此当它们完成时,它们会在目录中创建一个图像。但奇怪的是,当我使用communic()运行它们时,基本上是串联的,它们在预期的时间内完成(时间1 +时间2大致)。

然而,当我在没有communication()的情况下运行它们时,它们应该有效地并行执行它们,它们需要更长时间才能完成。有谁理解为什么会出现这种行为以及如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

要让它们并行运行,您需要多次实例化Popen。您的示例表明您不通过stdin,stdout或stderr与进程通信,而是通过文件进行通信。假设这样,您可以使用wait方法而不是communicate。所以结果可能如下所示:

commands = [['command', '1'], ['command', '2']]
processes = [Popen(command) for command in commands]
# they are both running now
returncodes = [process.wait() for process in processes]
# successful if all returncodes are 0

如果您的渲染过程也是用Python编写的,请查看multiprocessing模块。它可以帮助使用多个进程来代码化您的代码,从而避免GIL争用。

如果您确实在与流程进行通信,则需要使用更复杂的机制来复用IO操作。这也是multiprocessing模块可以派上用场的地方,但您也可以使用asyncore或其他IO框架来实现通信。