【问题标题】:Memoization in Python persisting between requestsPython中的记忆在请求之间持续存在
【发布时间】: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


【解决方案1】:

Daniel Roseman 在 cmets 中回答了这个问题:

“你自己回答了这个问题。一个 WSGI 应用程序在一个单独的进程(或许多进程)中运行,它会为许多请求持续存在”

【讨论】:

猜你喜欢
  • 2013-09-19
  • 2016-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-19
  • 1970-01-01
  • 2012-04-17
  • 2014-02-12
相关资源
最近更新 更多