根据stackoverflow(how to kill (or avoid) zombie processes with subprocess module)中另一个问题的答案,可以使用命令subprocess.Popen.wait()
来避免僵尸进程。
但是,当我在我的脚本中运行以下函数perform_sth
数千次时,每个单独进程的内存使用量往往会增加:
例如,第一个进程只需要7 MB,但是nr。 1000已经500 MB,直到最后使用超过8 GB,我必须杀死整个Python脚本。该过程应始终使用或多或少相同的内存量。
我的功能可能存在缺陷,需要另外杀死进程吗?
我的代码是:
def perform_sth(arg1, arg2):
import subprocess
sth_cline = ["sth", "-asequence=%s"%arg1, "-bsequence=%s"]
process = subprocess.Popen(
sth_cline,
stdout = subprocess.PIPE,
stderr = subprocess.PIPE
)
process.wait()
return
答案 0 :(得分:1)
如果您没有从管道中读取,请不要使用stdout=PIPE
。
您的子进程不是zombie (僵尸是一个死进程;它只需要很少的内存,将其退出状态存储在进程表中)。您的子进程 alive (这就是为什么它能够消耗千兆字节的内存)。
OS管道缓冲区可能已满,并且在尝试写入管道时阻止子进程。你的父母应该通过读取管道来消耗缓冲区,以允许孩子继续,但父母等待process.wait()
永远返回(死锁)。
如果您不需要输出,请改用stdout=subprocess.DEVNULL
。或者参见How to hide output of subprocess in Python 2.7
#!/usr/bin/env python
from subprocess import check_call, DEVNULL, STDOUT
check_call(["sth", "arg 1", "arg2"], stdin=DEVNULL, stdout=DEVNULL, stderr=STDOUT)