在我当前的项目中,我有一个get服务器,它调用Linux命令获取信息,然后显示在网站上。我遇到的问题是,RAM服务器运行在一个只有256 MB RAM的小型嵌入式设备上(它基本上是设备的配置工具)。RAM服务器本身确实占用了我在该设备上的一半以上的空闲内存。
现在,当我尝试使用subprocess.check_output()调用命令时,叉很快就会使内存使用量加倍(据我所知,因为它复制了父进程或其他东西),从而用“内存不足”使整个事件崩溃,尽管被调用的进程非常小。
由于设备使用了非常便宜的闪存芯片,如果过度使用,这些芯片就会失效,所以我不想使用任何基于增加虚拟内存的交换解决方案或其他解决方案。
到目前为止,我试图做的是在程序开始时打开sh会话,此时它的内存使用率仍然很低,然后将命令写入sh会话并读取输出。这是一种工作,但它是相当不稳定的,因为一个错误的“出口”或其他类似的东西可能会崩溃的整个事情。
是否有类似于subprocess.check_output()的解决方案不会使我的内存使用量增加一倍?
发布于 2015-06-17 10:51:48
所以在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()在Python2.7中,我本可以使用multiprocessing.set_start_method('forkserver'),,但由于它运行在Python2.7上,因此遗憾的是,这是不可用的。
尽管如此,这还是减少了我的内存使用量,并以一种干净的方式消除了问题。非常感谢你的帮助!
https://stackoverflow.com/questions/30847502
复制相似问题