subprocess.check_output 没有高内存使用率
subprocess.check_output without high memory usage
在我当前的项目中,我有一个网络服务器调用 Linux 命令来获取信息,然后显示在网站上。我遇到的问题是网络服务器在只有 256 MB RAM 的微型嵌入式设备上运行(它基本上是该设备的配置工具)。网络服务器本身确实占用了我在该设备上的一半以上的可用内存。
现在,当我尝试使用 subprocess.check_output() 调用命令时,fork 很快就会使 RAM 使用量翻倍(据我所知,因为它克隆了父进程或其他东西),从而使整个系统崩溃带有 "Out of Memory" 的东西,尽管被调用的进程非常小。
由于该设备使用非常便宜的闪存芯片,如果过度使用这些芯片已被证明会失败,我不想使用任何交换解决方案或其他基于增加虚拟内存的解决方案。
到目前为止,我尝试做的是在程序开始时内存使用率仍然很低时打开一个 sh 会话,然后将命令写入该 sh 会话并读取输出。这有点管用,但它很不稳定,因为错误的 "exit" 或类似的东西会使整个事情崩溃。
是否有类似于 subprocess.check_output() 的解决方案,不会使我的内存使用量增加一倍?
因此在 J.F 的帮助下。塞巴斯蒂安我想通了。
这是我最后使用的代码:
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 上运行,所以遗憾的是它不可用。
这仍然大大减少了我的内存使用量,并以干净的方式解决了问题。非常感谢您的帮助!
在我当前的项目中,我有一个网络服务器调用 Linux 命令来获取信息,然后显示在网站上。我遇到的问题是网络服务器在只有 256 MB RAM 的微型嵌入式设备上运行(它基本上是该设备的配置工具)。网络服务器本身确实占用了我在该设备上的一半以上的可用内存。
现在,当我尝试使用 subprocess.check_output() 调用命令时,fork 很快就会使 RAM 使用量翻倍(据我所知,因为它克隆了父进程或其他东西),从而使整个系统崩溃带有 "Out of Memory" 的东西,尽管被调用的进程非常小。
由于该设备使用非常便宜的闪存芯片,如果过度使用这些芯片已被证明会失败,我不想使用任何交换解决方案或其他基于增加虚拟内存的解决方案。
到目前为止,我尝试做的是在程序开始时内存使用率仍然很低时打开一个 sh 会话,然后将命令写入该 sh 会话并读取输出。这有点管用,但它很不稳定,因为错误的 "exit" 或类似的东西会使整个事情崩溃。
是否有类似于 subprocess.check_output() 的解决方案,不会使我的内存使用量增加一倍?
因此在 J.F 的帮助下。塞巴斯蒂安我想通了。
这是我最后使用的代码:
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 上运行,所以遗憾的是它不可用。
这仍然大大减少了我的内存使用量,并以干净的方式解决了问题。非常感谢您的帮助!