在我当前的项目中,我有一个网络服务器,它调用 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/