Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 23, 2015 15:56:21

zzzZZZ
Зарегистрирован: 2015-02-23
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Параллельный запуск функции в нескольких процессах и потоках

Приветствую!

Есть набор изолированных друг от друга функций, которые требуется запускать в отдельных процессах. Мне нужно реализовать скрипт запуска этих функций, примерно таким образом:

./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. Есть ли какие-то готовые решения для организации параллельного выполнения указанной функции в указанном модуле, с заданным количеством процессов и потоков?

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version