我意识到这是一个非常基本的问题。如果这看起来很愚蠢,请参阅下面的免责声明和上下文!
我经常有一个代表资源的对象——例如 Redis 队列——它在我的 Django 应用程序的多个地方使用。但是,资源不一定在每个 HTTP 请求中都被调用。
我应该:
实例化对象一次,并将其导入到 相关模块?
或者,在需要的每个模块中本地实例化对象?
选项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/