【发布时间】:2015-12-10 08:39:43
【问题描述】:
我今天早些时候遇到了这种技术,但不确定它是如何工作的。我认为这个例子并不重要,但我在应用程序中使用 Django。
def post_to_endpoint(request, key=None):
if not hasattar(post_to_endpoint, '__my_memo__'):
post_to_endpoint.__my_memo__ = {
"key1": "url" + "path",
"key2": "url2" + "path",
"key3": "url3" + "path",
"key4": "url4" + "path",
}
if key:
url = post_to_endpoint.__my_memo__.get(key, None)
if url:
# make my request here
# return the response
我知道在这个人为的例子中,它可能是一个微优化。在我的函数中,我会在每次调用时重新创建 dict。在基本层面上,我知道这个 dict 隐藏在一个名为 func_dict 的东西中,但我不太明白它是如何存在于请求之间的。
我从 PHP 背景的理解是,整个框架在每次请求时都会初始化,但 Python/Django/WSGI 可能不是这种情况?我也很难理解所有这些是如何通过进程/线程运行的,也许这些信息在那里保持活跃?我原以为这样的事情需要在某种持久化缓存中完成,但显然情况并非如此。
此外,其他地方提到的海报也可以通过 importing 字典来实现,但我也不明白在请求之间如何实现。
【问题讨论】:
-
你自己回答了这个问题。一个 WSGI 应用程序在一个单独的进程(或许多进程)中运行,它会为许多请求持续存在。
-
这里有一些选择,使用 ddbb 作为 redis 来共享信息甚至是 mmap(不太确定这个但我认为它可以工作)
-
使用像 memcached 或 Redis 这样的缓存系统
-
@DanielRoseman 所以在这种情况下,我的
function对象只有在 WSGI 启动时才被“初始化”,之后只要 WSGI 进程还活着,它就一直活着?我想我会期望它“死”或在不再需要它时收集垃圾或其他东西。 -
每个进程一次,是的 - 通常您会同时运行多个进程。由于各种原因,服务器偶尔会杀死并重新启动一个进程。所以这种类型的缓存真的只对小的加速有好处;你不能依赖缓存中的东西。
标签: python django request memoization