我不完全确定原因,但我基本上想要运行2个进程,所以我使用子进程Popen函数。
commands = ['command 1', 'command 2']
for command in commands:
proc = Popen(command.split(' '))
proc.communicate() # line of interest
命令是渲染过程,因此当它们完成时,它们会在目录中创建一个图像。但奇怪的是,当我使用communic()运行它们时,基本上是串联的,它们在预期的时间内完成(时间1 +时间2大致)。
然而,当我在没有communication()的情况下运行它们时,它们应该有效地并行执行它们,它们需要更长时间才能完成。有谁理解为什么会出现这种行为以及如何解决这个问题?
答案 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框架来实现通信。