Более эффективный способ захвата вывода/возможно, не .communicate() из нескольких подпроцессов Python? ⇐ Python
Более эффективный способ захвата вывода/возможно, не .communicate() из нескольких подпроцессов Python?
У меня есть следующий блок кода. cmdTable — это словарь, где ключи — это строки, описывающие открываемый подпроцесс (например, «out_From_hi_mom»), а значения — это исполняемая команда (например, «echo hi Mom»)… что-то вроде:< /п> cmdTable['himom'] : "эхо, привет, мамочка"
В конечном итоге это создает procOutput["himom"] : "привет, мама"
Все работает нормально, но я запускаю около 100 подпроцессов и пытаюсь выяснить, действительно ли они выполняются параллельно. Я очень подозреваю, что это не так, потому что журнал рядом с вызовом .communicate() всегда показывает, что подпроцессы возвращаются в точном порядке, в котором они были созданы.
Если верить временным меткам отладки, .communicate() также возвращает пакетно, что мне в любом случае не кажется ожидаемым поведением...
У меня сложилось впечатление, что я запускаю здесь кучу подпроцессов более или менее одновременно. Временные метки вызовов Popen подтверждают эту теорию: все ~100 из них запускаются примерно за секунду.
различные блоки кроме были удалены для краткости...
def runShowCommands(cmdTable) -> dict: """возвращает словарь захваченных выходных данных команд, определенных в cmdTable. """ procOutput = {} # dict для хранения выходного текста команд show прокХандлес = {} для cmd в cmdTable.keys(): пытаться: log.debug(f"выполняется подпроцесс {cmd} -- {cmdTable[cmd]}") procHandles[cmd] = subprocess.Popen(cmdTable[cmd], stdout=subprocess.PIPE, stderr=subprocess.PIPE) для дескриптора, процедура в procHandles.items(): пытаться: procOutput[handle] = proc.communicate(timeout=180)[0].decode("utf-8") # превращаем часть стандартного вывода в текст log.debug(f"подпроцесс вернул {handle}") вернуть procOutput Полагаю, стоит упомянуть, что все эти подпроцессы являются поточно-ориентированными по отношению друг к другу, меня не волнует, в каком именно порядке они выполняются, и они не имеют общего состояния ввода или вывода. Моя основная цель — минимизировать общее время выполнения настенных часов, и я достаточно уверен, что что-то упускаю, и все они работают последовательно, а не параллельно.
Есть ли что-то здесь, в использовании Popen и .communicate(), что я ошибся (я унаследовал этот код и свободно признаю, что он находится на грани моих способностей...)
У меня есть следующий блок кода. cmdTable — это словарь, где ключи — это строки, описывающие открываемый подпроцесс (например, «out_From_hi_mom»), а значения — это исполняемая команда (например, «echo hi Mom»)… что-то вроде:< /п> cmdTable['himom'] : "эхо, привет, мамочка"
В конечном итоге это создает procOutput["himom"] : "привет, мама"
Все работает нормально, но я запускаю около 100 подпроцессов и пытаюсь выяснить, действительно ли они выполняются параллельно. Я очень подозреваю, что это не так, потому что журнал рядом с вызовом .communicate() всегда показывает, что подпроцессы возвращаются в точном порядке, в котором они были созданы.
Если верить временным меткам отладки, .communicate() также возвращает пакетно, что мне в любом случае не кажется ожидаемым поведением...
У меня сложилось впечатление, что я запускаю здесь кучу подпроцессов более или менее одновременно. Временные метки вызовов Popen подтверждают эту теорию: все ~100 из них запускаются примерно за секунду.
различные блоки кроме были удалены для краткости...
def runShowCommands(cmdTable) -> dict: """возвращает словарь захваченных выходных данных команд, определенных в cmdTable. """ procOutput = {} # dict для хранения выходного текста команд show прокХандлес = {} для cmd в cmdTable.keys(): пытаться: log.debug(f"выполняется подпроцесс {cmd} -- {cmdTable[cmd]}") procHandles[cmd] = subprocess.Popen(cmdTable[cmd], stdout=subprocess.PIPE, stderr=subprocess.PIPE) для дескриптора, процедура в procHandles.items(): пытаться: procOutput[handle] = proc.communicate(timeout=180)[0].decode("utf-8") # превращаем часть стандартного вывода в текст log.debug(f"подпроцесс вернул {handle}") вернуть procOutput Полагаю, стоит упомянуть, что все эти подпроцессы являются поточно-ориентированными по отношению друг к другу, меня не волнует, в каком именно порядке они выполняются, и они не имеют общего состояния ввода или вывода. Моя основная цель — минимизировать общее время выполнения настенных часов, и я достаточно уверен, что что-то упускаю, и все они работают последовательно, а не параллельно.
Есть ли что-то здесь, в использовании Popen и .communicate(), что я ошибся (я унаследовал этот код и свободно признаю, что он находится на грани моих способностей...)
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Подпроцесс Python.Popen().communicate() зависает при чтении стандартного вывода
Anonymous » » в форуме Python - 0 Ответы
- 22 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Подпроцесс Python.Popen().communicate() зависает при чтении стандартного вывода [закрыто]
Anonymous » » в форуме Python - 0 Ответы
- 13 Просмотры
-
Последнее сообщение Anonymous
-