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

标签 python django

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

我经常有一个代表资源的对象——例如 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 的方式都由多个进程组成,每个进程都针对许多请求持续存在。同样,在您的情况下,每个服务器进程都有自己对队列对象的单一引用。

关于python - 在哪里实例化 Django/Python 应用程序的几个部分中使用的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41653948/

相关文章:

python - 使用描述符实现绑定(bind)方法

python - Pyramid 1.4 需要 WebOb 1.2b3+。 Google App Engine 提供 WebOb 1.1.1。难道这一切都要以泪水结束吗?

django - Postgresql 表分区 Django 项目

升级到 1.8.1 后 Django 管理员中断

django - CBV中的form_valid()不调用is_valid()方法吗?

python - 将纹理映射到网格时,Vtk 在节点之间插入不正确的颜色

python - 在 selenium 网络驱动程序中如何选择正确的 iframe

python - 'with' 语句在 Flask (Jinja2) 中如何工作?

django - 如何在不定义内容类型或模型的情况下使用 Django 权限?

python-3.x - 在 django/python 中计算每月数据