Как закончить (и оживить) рабочих в пушечном ящике?

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

(т.е. использовать ту же стратегию, что и maxtasksperchild в многопроцессорном пуле... "... Частая модель, найденная в других системах (например, Apache, mod_wsgi и т.д.) для освобождения ресурсов, удерживаемых рабочими, - это позволить работнику в пределах пул, чтобы завершить только заданный объем работы перед тем, как выходить, очищаться и новый процесс, созданный для замены старого..." )

Пока лучшее, что я смог придумать, это иметь поток, который спит, а затем вызывает os._exit(-1).

Это путь, или есть лучший способ периодически перерабатывать моих работников?

Вот путь, на который я сейчас опускаюсь:

class Quitter(Thread):

    def run(self):
        while True:
            time.sleep(random.randrange(5, 7)):
            print str(os.getpid())
            os._exit(-1)

Quitter().start()

К какому артиллеристу отвечает:

2013-03-13 03:21:24 [6487] [INFO] Booting worker with pid: 6487
...
2013-03-13 03:21:30 [6492] [INFO] Booting worker with pid: 6487

Ответы

Ответ 1

Gunicorn действительно имеет это доступное как вариант конфигурации - посмотрите max_requests.