在 Python 中重新加载模块时管理具有副作用的全局对象

发布于 2024-12-28 21:00:18 字数 133 浏览 2 评论 0原文

我正在寻找一种方法来正确管理使用某些操作系统资源(如文件或线程)的模块级全局变量。

问题是,当模块重新加载时,我的资源必须在创建新资源之前正确处置(例如文件关闭或线程终止)。

所以我需要一个更好的模式来管理这些单例对象。

I am looking for a way to correctly manage module level global variables that use some operating system resource (like a file or a thread).

The problem is that when the module is reloaded, my resource must be properly disposed (e.g. the file closed or the thread terminated) before creating the new one.

So I need a better pattern to manage those singleton objects.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

情愿 2025-01-04 21:00:18

我一直在阅读有关模块重新加载的文档,这非常有趣:

当模块重新加载时,它的字典(包含模块的
全局变量)被保留。名称的重新定义将覆盖
旧的定义,所以这通常不是问题。如果新的
模块的版本未定义旧模块定义的名称
版本,旧的定义仍然存在。此功能可用于
如果模块维护全局表或对象缓存,则该模块的优势
— 使用 try 语句,它可以测试表是否存在并跳过
如果需要的话,它的初始化:

try:
    cache
except NameError:
    cache = {}

所以我可以检查对象是否已经存在,并在创建新对象之前处理它们。

I've been reading the docs on module reload and this is quite interesting:

When a module is reloaded, its dictionary (containing the module’s
global variables) is retained. Redefinitions of names will override
the old definitions, so this is generally not a problem. If the new
version of a module does not define a name that was defined by the old
version, the old definition remains. This feature can be used to the
module’s advantage if it maintains a global table or cache of objects
— with a try statement it can test for the table’s presence and skip
its initialization if desired:

try:
    cache
except NameError:
    cache = {}

So I could just check if the objects already exist, and dispose them before creating the new ones.

雨的味道风的声音 2025-01-04 21:00:18

您需要 Monkeypatch 或 fork django 来挂钩 django 开发服务器重新加载功能并执行正确的操作来管理文件关闭等...

但是既然您开发了 django 应用程序,如果您打算使用正确的服务器来为您的应用程序提供服务将来您应该考虑管理全局变量并考虑 信号量所有爵士乐

但是在走这条路线并实现所有这些容易出错和脱发的困难代码之前。您应该考虑其他解决方案,例如 nosql 数据库(redismongodbneo4jhadoop。 ..)和后台进程管理器,例如 celery齿轮工。如果所有这些都不适合您的用例,并且您无法避免自己创建和管理文件以及全局变量,那么请考虑 客户端/服务器模式,其中客户端是网络服务器线程,除非你想搞乱NFS

You need to monkeypatch or fork django to hook into django dev server reloading feature and do the proper thing to manage file closing etc...

But since you develop a django application, if you mean to use a proper server to serve your app in the future you should consider managing your global variables and think about semaphores and all that jazz.

But before going this route and implement all this difficult code prone to error and hair loss. You should consider other solution like nosql databases (redis, mongodb, neo4j, hadoop...) and background process managers like celery and gearman. If all of this don't feet your use-case(s) and you can't avoid to create and manage files yourself and global variables then consider the client/server pattern where clients are webserver threads unless you want to mess with NFS.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文