1

介绍

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

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

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

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

问题

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

4

3 回答 3

3

WSGI 只是一个标准化的接口,它使得构建 Web 服务器架构的各种组件成为可能,以便它们可以相互通信。

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

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

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

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

于 2012-08-14T08:26:35.563 回答
2

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

来自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.

于 2012-08-14T09:24:17.420 回答
1

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

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

于 2012-08-13T20:10:14.800 回答