Очистка после обработки WSGI

Я запускаю приложение TurboGears с mod_wsgi и apache, используя pymongo, завернутый в Ming, для постоянства. Для отказоустойчивости и масштабирования моего приложения мне было интересно использовать поддержку mongo для наборов реплик через pymongo ReplicaSetConnection.

Однако, как указано в приведенных выше ссылках, необходимо вызывать close(), когда это делается с каждым объектом pymongo ReplicaSetConnection, иначе он оставит кучу процессов-зомби, плавающих вокруг (wtf pymongo). Такое поведение не очень хорошо поддерживается в Ming (на самом деле он еще не поддерживает наборы реплик), но мне удалось написать функцию очистки, которая закрывает все соединения pymongo.

Теперь я хочу запустить функцию очистки для очистки процесса для всех процессов моего приложения. У них есть две основные точки входа: mod_wsgi через команды apache и paste. Добавить мою очистку в команды вставки не проблема, но есть ли способ указать функцию очистки для процессов wsgi?

Если нет, какие еще советы по правильной настройке?


person Will    schedule 06.08.2012    source источник


Ответы (2)


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

http://code.google.com/p/modwsgi/wiki/Регистрациякодаочистки

person Graham Dumpleton    schedule 06.08.2012
comment
Я считаю, что этого должно быть достаточно. Мои процессы зависают, когда я не закрываю сеансы, поэтому я предполагаю, что упомянутая фоновая задача находится в основном процессе. Я подтвержу это здесь, когда проведу несколько тестов. - person Will; 07.08.2012
comment
Функция очистки будет вызываться в каждом процессе WSGI, где вы вызываете atexit.register(). - person Graham Dumpleton; 07.08.2012
comment
Разве в самом WSGI нет для этого чего-то стандартного? - person Christopher Smith; 22.10.2014
comment
В стандарте на что конкретно? Очистка после запроса рассматривается в этом документе. Для полной очистки процесса при завершении работы нет, в спецификации WSGI ничего нет. - person Graham Dumpleton; 24.10.2014

Сам TurboGears также предоставляет хук shutdown, который можно зарегистрировать с помощью base_config.register_hook внутри config/app_cfg.py.

Хук выключения вызывается всякий раз, когда процесс существует

person amol    schedule 22.09.2012