подпроцесс.проверка вывода без использования высокой памяти

в моем текущем проекте у меня есть веб-сервер, который вызывает команды 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, это, к сожалению, недоступно.

тем не менее это уменьшает использование моей памяти на Большой выстрел и устраняет проблему чистым способом. Большое спасибо за помощь!