Open vladignatyev opened 5 years ago
Мне кажется, что это велик. У supervisord вроде есть API http://supervisord.org/index.html
он как раз на python написан
Глянул документацию по supervisord
. Он реально монструозен. Как минимум из-за клиент/серверной архитектуры и RPC API.
То есть, supervisord из коробки ну прямо вообще нихуяшечки не предоставляет даже близко того, что надо. Из-за того, что у него нет возможности его использования как библиотеки. Он — сервер, который как-то надо запускать, как-то с ним коммуницировать и так далее.
RPC API это интерфейс для взаимодействия с этим самым сервером.
Получается, что воткнув supervisord
я бы столкнулся с той же проблемой — мне в тесте нужно запускать параллельный процесс. Окей, пусть это будет супервайзерд. Но тогда мне нужно как-то выгребать из него логи и знать когда он упал, а когда закончились тесты, гарантированно прибить дочерние процессы. Вот эти штуки и решает Multiprocess
.
Просто код в proc посмотри! Только ради этого тащить такие глобальные опердени как supervisord
как-то чересчур!
Необходимо более легковесное решение. Пока psutil
даже слишком тяжелое решение, хотя это просто враппер над subprocess
из стандартной библиотеки + кучи неиспользуемого (но потенциально полезного стафа). Например, с помощью psutil
тест проверяющий использование памяти системой может быть написан в пару строк буквально + это API сейчас открыто для пользователей proc.Multiprocess
.
Но есть более имхо правильный вариант: расковырять supervisord, и если вдруг он не монолитный, найти именно тот пакет который релаизует функционал схожий с Multiprocess и заюзать его. По идее же где-то в supervisord должно быть нечто похожее?..
Настораживает только то, что subprocess
, на котором построен щас мой код, находится в стандартной библиотеке Python'а. А все эти psutil
и supervisord
это уже охеренного размера библиотеки/фреймворки/сервера. Открутить psutil
я точно могу.
Так что пусть лучше это полежит здесь и подождёт часа когда мы это заменим на нормальное решение.
Не знаю куда сохранить. Просто пример использования класса
Multiprocess
иLogTrap
изproc
.Мне был нужен класс/метод, позволяющий запустить параллельно серверные процессы (redis-server, majorka). Я хотел заюзать его в TestCase'е для «большого теста».
На практике оказалось, что: 1) если по-тупому использовать
subprocess
, то легко поймать зомби-процессы 2) сложно реализовать error handling этих процессов сsubprocess
3) чтение из STDERR/STDOUT процесса блокирует основной процесс в Python.Multiprocess
позволяет запустить в фоне процессы, отследить их смерть если нужно и получить постмортэм логи.LogTrap
позволяет читать логи процесса из STDERR/STDOUT без блокирования основного процесса с помощью запуска отдельной нити, которая может блокироваться.Я заюзал
psutil
, которая даёт высокоуровневые абстракции и обертку над системными методами для процессов.Внизу пример скрипта, который запускает redis-server и majorka в фоне, выводит дерево процессов, логирует происходящее и позволяет в интерактивном режиме выводить логи из каждого из под-процессов. В случае смерти одного из субпроцессов, в терминал выводится лог и осуществляется зачистка — убиваются остальные процессы, а в случае зависания им посылается SIGTERM, если в течение таймаута их не удаётся убить, в лог показывается сообщение с PID зомби-процессов.