2012-08-13 29 views
1

INTRO如何WSGI ENV处理本地长期居住对象

我最近已经转向Python,经过10年左右的PHP开发和习惯。

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

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

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

问题

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

回答

2

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

Pyramid Docs#Startup

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

1

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

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

3

WSGI仅仅是一个标准化的接口,可以构建Web服务器体系结构的各种组件,以便他们可以相互交流。

金字塔是一个框架,其组件通过WSGI彼此粘合。

金字塔,像其他WSGI框架,使得可以选择栈的实际服务器一部分,就像gunicorn,阿帕奇,或其他。这个选择是你要做的,这是你的问题的最终答案。

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

如果您的模型是多线程的,那么您可能确实依赖于全局状态,但请注意事实是您在代码中引入了强依赖性。也许单身模式加上依赖注入可以帮助你保持你的代码更干净,更容易改变。

+0

Upvote,从我学习重要的东西,从你的答案和干净的方式实现我的目标是在我自己的回答中提到:) – canni 2012-08-14 09:26:02