虽然调用了subprocess.Popen.wait(),但Python中的子进程模块创建的进程是否仍然可能耗尽内存(僵尸)?

时间:2013-11-15 14:56:50

标签: python memory subprocess

根据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 

1 个答案:

答案 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)