LINUX.ORG.RU

Как добавлять процессы в multiprocessing.Pool на ходу?

 ,


1

2

Код примерно такой:


from multiprocessing import Pool
# импорт всего, что нужно

# функция, выполняющаяся в многопотоке
def worker(data):
    #много кода

# Ловим событие, по нему запускаем многопоточный код
@watcher.on_message()
def start(client, message):

    # немного кода, 
    # в итоге получаем список result
    p = Pool(10)
    p.map(worker, result)
    


Но при такой реализации при множестве одновременно срабатывающих событий создается огромное количество потоков, в итоге переполняется память и приходится перезагружать сервер
Как сделать правильно, чтобы Pool был один единственный и в него добавлялись задачи по событиям? При этом надо чтобы сохранилась многопоточность и количество потоков было ограничено.

★★★★★

Ответ на: комментарий от rikimaru

Переделал на ProcessPoolExecutor - вроде работает как надо, не плодит потоки

Qwentor ★★★★★ ()

переполняется память и приходится перезагружать сервер

Зачем перезагружать? Почему нельзя убить и перезапустить жирные сервисы?

anonymous ()
Ответ на: комментарий от Qwentor

https://github.com/hakavlad/nohang

Можно автоматически перезагружать, когда запас памяти еще есть.

https://github.com/hakavlad/nohang

В конфиге ставишь:

@SOFT_ACTION_RE_CGROUP_V1  ^/system\.slice/  /// systemctl restart $SERVICE

Пиши в issues если нужна помощь с конфигурацией.

anonymous ()
Ответ на: комментарий от anonymous

Спасибо, сохраню, может когда-то понадобится. Я уже решил проблему не через зад - скрипт больше не жрет столько памяти и сервер не падает.

Qwentor ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.