Skip to main content
 首页 » 编程设计

python之在哪里实例化 Django/Python 应用程序的几个部分中使用的对象

2024年10月17日30zlslch

我意识到这是一个非常基本的问题。如果这看起来很愚蠢,请参阅下面的免责声明和上下文!

我经常有一个代表资源的对象——例如 Redis 队列——它在我的 Django 应用程序的多个地方使用。但是,资源不一定在每个 HTTP 请求中都被调用。

我应该:

  1. 实例化对象一次,并将其导入到 相关模块?

  2. 或者,在需要的每个模块中本地实例化对象?

选项1

共享.py

from redis import Redis 
from rq import Queue 
 
queue = Queue(connection=Redis()) 

views1.py

from shared import queue 
# ... use the queue 

views2.py

from shared import queue 
# ... use the queue 

选项 2

views1.py

from redis import Redis 
from rq import Queue 
 
queue = Queue(connection=Redis()) 
# ... use the queue 

views2.py

from redis import Redis 
from rq import Queue 
 
queue = Queue(connection=Redis()) 
# ... use the queue 

免责声明和背景

我敢肯定这个问题看起来很初级。我意识到这两种方法都有效 - 我真的在问,以便我可以更好地理解所涉及的基础知识。

这两种方法的含义和后果是什么?在某些情况下使用选项 1 而在其他情况下使用选项 2 是否有优势?

我已经阅读了一些关于 python 的导入系统的内容,发现这些概念有些令人困惑。我也不完全理解运行 Django 应用程序的 python 进程是如何工作的。具体来说,(1) 何时加载对象,(2) 在 python 进程的生命周期内是否每个对象都保留在内存中,以及 (3) python 进程如何以及是否通过多个 HTTP 请求持续存在。

提前致谢。

请您参考如下方法:

选项 1 可能是最好的。这实际上使它成为一个单例,可以在任何需要的地方使用。

就您的后续问题而言,模块级别的所有内容都在该模块首次导入流程时执行。当后续模块导入第一个模块时,不再执行;他们只是获得对同一对象的其他引用。所以在这种情况下,您的队列只有一个实例化。只要有对它们的引用,对象就会保留在内存中;由于此对象是在模块级别实例化并分配给模块级别变量的,因此该实例将在整个过程期间保留在内存中。

这里有很多关于进程在 Django 中如何工作的问题;可以这么说,尽管这在某种程度上取决于运行它的服务器,但几乎所有运行 Django 的方式都由多个进程组成,每个进程都针对许多请求持续存在。同样,在您的情况下,每个服务器进程都有自己对队列对象的单一引用。