首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在哪里实例化Django/Python应用程序的几个部分中使用的对象?

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

Stack Overflow用户
提问于 2017-01-14 19:15:23
回答 1查看 214关注 0票数 3

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

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

我是否应该:

  1. 实例化对象一次,并将其导入相关模块?
  2. 或者,在需要对象的每个模块中本地实例化对象?

备选案文1

shared.py

代码语言:javascript
运行
复制
from redis import Redis
from rq import Queue

queue = Queue(connection=Redis())

views1.py

代码语言:javascript
运行
复制
from shared import queue
# ... use the queue

views2.py

代码语言:javascript
运行
复制
from shared import queue
# ... use the queue

选项2

views1.py

代码语言:javascript
运行
复制
from redis import Redis
from rq import Queue

queue = Queue(connection=Redis())
# ... use the queue

views2.py

代码语言:javascript
运行
复制
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请求持续存在。

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-14 20:01:05

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

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

这里有很多关于Django中的进程是如何工作的问题;尽管这在某种程度上取决于运行Django的服务器,但是几乎所有的运行Django的方法都由多个进程组成,每个进程对于许多请求都是持久的。同样,在您的示例中,每个服务器进程都将有自己对队列对象的单个引用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41653948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档