У меня есть набор длительных процессов в типичной настройке «pub/sub» с очередями для связи.Многопроцессорность Python - процесс сторожевого таймера?
Я хотел бы сделать две вещи, и я не могу понять, как выполнить оба одновременно:
- добавление/удаление рабочих. Например, я хочу иметь возможность добавлять дополнительных потребителей, если увижу, что размер ожидающих запросов слишком велик.
- Watchdog для моих процессов. Я хочу получать уведомление, если кто-либо из моих производителей или потребителей сработает.
можно сделать (2) в изоляции:
try:
while True:
for process in workers + consumers:
if not process.is_alive():
logger.critical("%-8s%s died!", process.pid, process.name)
sleep(3)
except KeyboardInterrupt:
# Python propagates CTRL+C to all workers, no need to terminate them
logger.warn('Received CTR+C, shutting down')
Вышеуказанные блоки, что мешает мне делать (1).
Поэтому я решил переместить код в свой собственный процесс.
Это не работает, потому что process.is_alive()
работает только для родителя, проверяющего статус своих детей. В этом случае процессы, которые я хочу проверить, будут братьями и сестрами вместо детей.
Я немного озадачен тем, как действовать. Как мой основной процесс может поддерживать изменения в подпроцессах, а также отслеживать подпроцессы?
Вы не можете сделать это напрямую, по крайней мере, не таким образом, чтобы вы могли назвать «читаемый код, который имеет смысл». Чтобы управлять им, вам потребуется уровень абстракции, который распределяет задания для работников, которые могут получать команды для увеличения/уменьшения. Честно говоря, писать довольно сложно, и есть готовые системы, которые это делают, посмотрите на сельдерей. –
@Puciek Я использовал сельдерей на других проектах. Он служит для другого варианта использования (AFAIK) - запуск асинхронных заданий.Я никогда не слышал, чтобы использовать его для управления долгосрочными производителями и потребителями. – knite
Вы можете очень хорошо использовать его для запуска долгосрочных заданий, включая серверы потребителей - все скрипты были созданы равными в конце, просто не забудьте отключить тайм-аут. И он поставляется с функцией автомасштаба, которую вы, похоже, ищете. –