Есть набор изолированных друг от друга функций, которые требуется запускать в отдельных процессах. Мне нужно реализовать скрипт запуска этих функций, примерно таким образом:
./loader.py –processes=5 –threads=2 func_name
Скрипт должен делать следующее:
1. Непрерывно поддерживать заданное количество работающих процессов, выполняющих указанную функцию (если процесс завершился, неважно, успешно или нет - его нужно перезапустить)
2. Завершать их по получению sigterm процессом, в котором запускается loader.py
Сначала попробовал передавать в map бесконечный iterable:
def generate_workers(module_name, class_name, num_threads): while True: yield (module_name, class_name, num_threads) pool = multiprocessing.Pool(cfg.get('num_processes', 1)) pool.map(run_worker, generate_workers(cfg['module'], cfg['worker_class_name'], cfg['num_threads']))
но это не работает, т.к. map читает сразу весь список, в итоге скрипт потребляет много памяти и зависает
Если же вызывать map в цикле, передавая ровно столько заданий, сколько создается процессов, то все эти процессы будут перезапущены только когда прекратит работу последний из них.
Вариант с ручным запуском через multiprocess.Process и периодическим отслеживанием is_alive не хотелось бы использовать, т.к. это приводит к бесполезной трате процессорного времени.
Вопросов собственно два:
1. Как можно решить данную проблему средствами multiprocessing?
2. Есть ли какие-то готовые решения для организации параллельного выполнения указанной функции в указанном модуле, с заданным количеством процессов и потоков?