Управление глобальными объектами с побочными эффектами при перезагрузке модуля в Python - PullRequest
1 голос
/ 25 января 2012

Я ищу способ правильно управлять глобальными переменными уровня модуля, которые используют какой-либо ресурс операционной системы (например, файл или поток).

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

Так что мне нужен лучший шаблон для управления этими одноэлементными объектами.

Ответы [ 2 ]

1 голос
/ 25 января 2012

Я читал документы по перезагрузке модуля, и это довольно интересно:

Когда модуль перезагружается, его словарь (содержащий глобальные переменные модуля) сохраняется.Переопределения имен переопределят старые определения, так что это обычно не проблема.Если новая версия модуля не определяет имя, которое было определено старой версией, старое определение остается.Эта функция может использоваться в интересах модуля, если он поддерживает глобальную таблицу или кэш объектов - с помощью оператора try он может проверить наличие таблицы и при желании пропустить ее инициализацию:

try:
    cache
except NameError:
    cache = {}

Так что я мог бы просто проверить, существуют ли уже объекты, и избавиться от них перед созданием новых.

0 голосов
/ 25 января 2012

Вам нужно сделать monkeypatch или fork django, чтобы подключиться к функции перезагрузки сервера django dev и сделать все необходимое для управления закрытием файлов и т. Д ...

Но , так как вы разрабатываете приложение django, если вы хотите использовать в будущем надлежащий сервер для обслуживания вашего приложения, вам следует рассмотреть возможность управления глобальными переменными и подумать о семафорах и весь этот джаз .

Но прежде чем идти по этому пути и реализовать весь этот сложный код, подверженный ошибкам и выпадению волос. Вы должны рассмотреть другое решение, такое как nosql базы данных ( redis , mongodb , neo4j , hadoop ...) и менеджеры фоновых процессов, такие как сельдерей и gearman . Если все это не соответствует вашим (-ым) сценариям (-ам) использования, и вы не можете избежать создания и управления файлами самостоятельно и глобальными переменными, тогда рассмотрите шаблон клиент / сервер , где клиенты являются потоками веб-сервера, если только вы хочу связываться с NFS .

...