使用Python立即启动Python子进程

最后发布: 2016-09-02 02:05:54


问题

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

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

这是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中的“僵尸”进程

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


回答

subprocess文档(重点是我的):

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

考虑改用Popen