python - subprocess.check_output 没有高内存使用

标签 python linux memory subprocess

在我当前的项目中,我有一个网络服务器,它调用 Linux 命令来获取然后显示在网站上的信息。我遇到的问题是网络服务器运行在只有 256 MB RAM 的微型嵌入式设备(它基本上是设备的配置工具)上。网络服务器本身确实占用了我该设备上一半以上的可用 RAM。

现在,当我尝试使用 subprocess.check_output() 调用命令时,fork 很快就会使 RAM 使用量翻倍(据我所知,因为它克隆了父进程或其他东西),从而使整个事情崩溃了一个“Out of Memory”,虽然被调用的进程很小。

由于该设备使用相当便宜的闪存芯片,如果过度使用这些芯片会失效,我不想使用任何交换解决方案或其他基于增加虚拟内存的解决方案。

到目前为止,我尝试做的是在程序开始时打开一个 sh session ,当它的内存使用率仍然很低时,然后将命令写入该 sh session 并读取输出。这有点工作,但它很不稳定,因为错误的“退出”或类似的东西可能会使整个事情崩溃。

有没有类似于 subprocess.check_output() 的解决方案不会使我的内存使用量翻倍?

最佳答案

所以在 J.F. Sebastian 的帮助下,我想通了。

这是我最后使用的代码:

from multiprocessing import Process, Queue
from subprocess import check_output, CalledProcessError

def cmdloop(inQueue,outQueue):
    while True:
        command = inQueue.get()
        try:
            result = check_output(command,shell=True)
        except CalledProcessError as e:
            result = e

        outQueue.put(result)

inQueue = Queue()
outQueue = Queue()
cmdHostProcess = Process(target=cmdloop, args=(inQueue,outQueue,))
cmdHostProcess.start()

def callCommand(command):
    inQueue.put(command)
    return outQueue.get()

def killCmdHostProcess():
    cmdHostProcess.terminate()

在 Python 3.4+ 中,我本可以使用 multiprocessing.set_start_method('forkserver'),但由于它在 Python 2.7 上运行,因此遗憾的是不可用。

这仍然大大减少了我的内存使用量,并以干净的方式解决了问题。非常感谢您的帮助!

关于python - subprocess.check_output 没有高内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30847502/

相关文章:

python - 将参数传递给 Python subprocess.Popen

linux - bash 脚本多重条件

linux - 即使编译后也无法运行scala程序

C++ 分配的指针显示意外行为

php - PHP 'out of memory' 错误可能是由 MySQL 服务器限制引起的吗?

python - 为什么使用 Python 子进程调用 ssh 会破坏外部 bash 循环

python - 如何替换嵌套字典中的值

python - 有没有办法检查用户和通行证在 python 3 中的 gmail 中是否有效?

r - 在 R 中逐行绑定(bind) data.frames 而不创建副本

python - Imagemagick 魔杖使用深度不像命令行那样工作