如何在WSGI环境中处理本地长生活对象

时间:2012-08-13 19:58:30

标签: python wsgi pyramid

INTRO

经过大约10年的PHP开发和习惯,我最近才转向使用Python。

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

据我所知(我希望)Python的WSGI环境,一个应用程序创建一次,直到该应用程序关闭,每个请求只调用方法/函数。

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

问题

我希望有一个类实例,因为对__init__的调用非常昂贵(在计算和资源锁定方面)。在PHP中,在每个请求中实例化都会降低性能,我是否正确使用Python的WSGI我可以在app启动时实例化一次,并通过请求使用?如果是这样,我该如何做到这一点?

3 个答案:

答案 0 :(得分:3)

WSGI只是一个标准化的接口,可以构建Web服务器体系结构的各种组件,以便它们可以相互通信。

Pyramid是一个框架,其组件通过WSGI相互粘合。

Pyramid与其他WSGI框架一样,可以选择堆栈的实际服务器部分,如gunicorn,Apache或其他。你可以选择这个选择,而你的问题就是最终答案。

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

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

答案 1 :(得分:2)

在Pyramid文档中提到了我发现的最好的方法(我之前错过了它):

来自Pyramid Docs#Startup

  

请注意,作为**settings传递给Configurator构造函数的值的增强版本将在Pyramid视图可调用代码中以request.registry.settings的形式提供。您可以稍后从视图代码创建要访问的对象,并将它们放入作为设置传递给配置程序的字典中。然后它们将在应用程序运行时出现在request.registry.settings字典中。

答案 2 :(得分:1)

有很多方法可以在pyramid中执行此操作,具体取决于您最终要完成的操作。仔细查看Pyramid/SQLAlchemy tutorial作为如何处理昂贵的初始化(数据库连接和元数据设置)然后将其传递到请求处理引擎的示例可能很有用。

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