[英]Python subprocess.Popen.wait(Popen) not redirecting output to file
[英]Is it possible that processes created by subprocess module in Python still use up memory (are zombies), although subprocess.Popen.wait() was called?
根据stackoverflow中另一个问题的答案( 如何使用子进程模块杀死(或避免)僵尸进程 ),可以使用命令subprocess.Popen.wait()
避免僵尸进程。
但是,当我在脚本中运行以下函数perform_sth
几千次时,每个进程的内存使用量往往会增加:
例如,第一个进程仅需要7 MB,但是仅需7 MB。 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
如果您不从管道读取数据,请不要使用stdout=PIPE
。
您的子进程不是僵尸 (僵尸是一个死进程;它只需要很少的内存,即可将其退出状态存储在进程表中)。 您的子进程仍处于活动状态 (这就是为什么它能够消耗千兆字节的内存)。
尝试写入管道时,操作系统管道缓冲区可能已满,并且子进程被阻塞。 您的父级应该通过从管道中读取来耗尽缓冲区,以允许子级继续运行,但是父级等待process.wait()
永远返回(死锁)。
如果不需要输出,请改用stdout=subprocess.DEVNULL
。 或参阅如何在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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.