подпроцесс.проверка вывода без использования высокой памяти
в моем текущем проекте у меня есть веб-сервер, который вызывает команды Linux для получения информации, которая затем отображается на веб-сайте. Проблема в том, что веб-сервер работает на крошечном встроенном устройстве (это в основном инструмент настройки для устройства), который имеет только 256 МБ ОЗУ. Сам веб-сервер занимает более половины свободного ОЗУ, которое у меня есть на этом устройстве.
теперь, когда я пытаюсь использовать подпроцесс.check_output () для вызова команды вилка в ближайшее время удваивает использование ОЗУ (потому что он клонирует родительский процесс или что-то еще, насколько я понимаю) и, таким образом, разбивает все это с "из памяти", хотя вызываемый процесс довольно крошечный.
поскольку устройство использует довольно дешевые флеш-чипы, которые оказались неудачными, если они используются, я не хочу использовать какие-либо решения подкачки или другие решения, основанные на увеличении виртуальной памяти.
то, что я пытался сделать до сих пор, это Popen сеанс sh в начале программа, когда он все еще низкий на использование памяти, а затем записать команды в этот сеанс sh и прочитать вывод. Это работает, но он довольно нестабилен, так как неправильный "выход" или что-то подобное может разрушить все это.
есть ли решение, подобное подпроцессу.check_output() это не двойник моей памяти?
1 ответов
Итак, с помощью Дж. Ф. Себастьяна я понял это.
Это код, который я использовал в конце:
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+ я мог бы использовать многопроцессорность.set_start_method ('forkserver'), но поскольку это работает на Python 2.7, это, к сожалению, недоступно.
тем не менее это уменьшает использование моей памяти на Большой выстрел и устраняет проблему чистым способом. Большое спасибо за помощь!