我最近上传了一个使用django appengine补丁的应用程序,当前有一个每两分钟运行一次的cron作业。每次调用工作程序url时,都会消耗大量资源
/worker_url 200 7633ms 34275cpu_ms 28116api_ms
这是因为每次调用都会对所有库django等进行冷zipimport。
导入的模块在内存中保留多长时间?
有没有一种方法可以将这些模块保留在内存中,即使后续调用不在这些模块保留在内存中的时间范围内,它们仍然不会调用开销?
最佳答案
只要应用引擎在同一节点的同一进程中为一个或多个请求提供服务,它就会按照正常的Python语义将所有内容保留在内存中;如果且何时需要这些资源,则该进程将消失(因此没有任何东西留在内存中,它曾经拥有过),并且可以随时(在同一节点或不同节点上)启动新进程来服务请求(其他进程是否在服务)其他请求仍在运行)。这非常类似于快速CGI模型:您可以确保在单个请求中具有正常的语义,但除了0到N(没有上限)之间的任何内容外,其他节点可能正在运行您的代码,每个节点依次服务于0到N之间的任何内容。 K(无上限)不同的请求。
您无法做任何事情“留在内存中”(对于zipimport的模块或其他任何东西)。
为了完整起见,我要提到memcache,它是对App Engine运行时的显式提示/请求,用于将某些内容保留在特殊形式的内存中,该分布式哈希表在运行您的代码的所有进程之间共享-尽管很难,但并非不可能使用对于导入的模块(您将需要非常复杂的导入挂钩),我建议您避免开发此类挂钩所需的工作,因为即使存在此类显式提示,App Engine运行时仍可以随时选择退出已隐藏的任何内容无论如何在缓存中。
相反-我不确定为什么特别是cron作业需要所有django,也不知道为什么要压缩导入,而不是按照the docs仅使用应用程序引擎随附的1.0.2-关心阐述?这对于您进行优化可能是一个有用的问题。