我知道这是一个非常基本的问题。如果这看起来很愚蠢,请看下面的免责声明和上下文!
我经常有一个对象表示资源--例如Redis队列--它在我的Django应用程序中的几个地方使用。但是,并不一定在每个HTTP请求中都调用该资源。
我是否应该:
备选案文1
shared.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请求持续存在。
提前谢谢。
发布于 2017-01-14 20:01:05
备选方案1可能是最好的办法。这实际上使它成为一个单例,可以在任何需要它的地方使用。
就后续问题而言,模块级别的所有内容都是在流程中首次导入该模块时执行的。当后续模块导入第一个模块时,不会再次执行该模块;它们只是获得对同一个对象的额外引用。因此,在这种情况下,只需对队列进行一次实例化。对象保留在内存中,只要有对它们的引用;由于该对象是在模块级别实例化并分配给模块级变量的,因此该实例将在整个过程中保持在内存中。
这里有很多关于Django中的进程是如何工作的问题;尽管这在某种程度上取决于运行Django的服务器,但是几乎所有的运行Django的方法都由多个进程组成,每个进程对于许多请求都是持久的。同样,在您的示例中,每个服务器进程都将有自己对队列对象的单个引用。
https://stackoverflow.com/questions/41653948
复制相似问题