使用Python毫不拖延地启动Python子进程

时间:2016-09-02 02:05:54

标签: python concurrency subprocess

我想使用subprocess.call启动python脚本的多个实例,但启动脚本会等待每个实例完成。如何在不等待上一个工作完成的情况下,如何防止它一个接一个地等待?

step = 5
for n in range(5, 11, step):
    subprocess.call(["python", cwd + "/" + "subprocess.py", str(n - step), str(n)])

2 个答案:

答案 0 :(得分:3)

这是subprocess.call()的记录行为,因此您无法以这种方式使用它。相反,您可以使用subprocess.Popen()

import subprocess
import os.path

processes = []
step = 5
for n in range(5, 11, step):
    processes.append(subprocess.Popen(['python', os.path.join(cwd, 'child.py'), str(n - step), str(n)]))

for p in processes:    # wait for the child processes to terminate, avoid zombies
    p.wait()

请注意,命名文件subprocess.py是个坏主意,特别是如果它与主脚本位于同一目录中 - import subprocess将导入本地版本,而不是系统版本。我在上面的代码中将其重命名为child.py

父进程等待子进程也很重要。省略这一点可能导致Linux中的"zombie" processes

如果您使用的是Python 3,则可以调查asyncio模块的使用情况。

答案 1 :(得分:1)

subprocess文档(强调我的):

  • 使用参数运行命令。 等待命令完成,然后返回returncode属性。

考虑使用Popen代替