如何在wsgien中处理本地longlife对象

2024-09-30 18:16:58 发布

您现在位置:Python中文网/ 问答频道 /正文

简介

在经历了大约10年的PHP开发和习惯之后,我最近转向了Python。在

在Symfony2中,每个对服务器的请求(例如Apache)都必须加载Eg.container类并实例化它,以构造对象的“rest”。在

据我所知(我希望)Python的wsgienv,一个应用程序只创建一次,在该应用程序关闭之前,每个请求都只调用方法/函数。在

这意味着我可以拥有某个类的一个实例,每次请求被调度时都可以访问它,而不必在每个请求中实例化它。我说得对吗?在

问题

我想要一个类的实例,因为对__init__的调用非常昂贵(在计算和资源锁定中)。在PHP中,在每个请求中实例化这个会降低性能,使用Python的WSGI,我可以在应用程序启动时实例化一次,然后通过请求使用它,对吗?如果是这样的话,我如何做到这一点?在


Tags: 对象实例方法函数服务器rest应用程序apache
3条回答

pyramid中有很多方法可以做到这一点,这取决于您最终想要完成的任务。仔细研究一下Pyramid/SQLAlchemy tutorial作为一个示例,说明如何处理昂贵的初始化(数据库连接和元数据设置),然后将其传递到请求处理引擎中,这可能很有用。在

请注意,在引用的链接中,问题的重要部分是__init__.py文件对initialize_sql的处理以及{}的后续创建。在

WSGI仅仅是一个标准化的接口,它使得构建web服务器体系结构的各种组件成为可能,以便它们能够相互通信。在

金字塔是一个框架,其组件通过WSGI相互粘合。在

与其他WSGI框架一样,Pyramid允许选择堆栈中实际的服务器部分,如gunicorn、Apache或其他。这个选择是你自己做的,你的问题就有了最终的答案。在

您需要知道的是您的服务器是多线程还是多进程。在后一种情况下,仅仅检查全局变量是否已实例化以初始化代价高昂的资源是不够的,因为后续的请求可能会在不共享状态的单独进程中结束。在

如果您的模型是多线程的,那么您可能确实依赖于全局状态,但请注意,您在代码中引入了一个强依赖性。也许单例模式与依赖注入相结合可以帮助您保持代码更干净,更易于更改。在

我发现的最好的方法是在金字塔文档中提到的(我之前错过了):

来自Pyramid Docs#Startup

Note that an augmented version of the values passed as **settings to the Configurator constructor will be available in Pyramid view callable code as request.registry.settings. You can create objects you wish to access later from view code, and put them into the dictionary you pass to the configurator as settings. They will then be present in the request.registry.settings dictionary at application runtime.

相关问题 更多 >