【问题标题】:How to handle local long-living objects in WSGI env如何在 WSGI 环境中处理本地长寿命对象
【发布时间】:2012-08-13 19:58:30
【问题描述】:

介绍

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

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

据我了解(我希望)Python 的 WSGI 环境,一个应用只创建一次,在该应用关闭之前,每个请求都只调用方法/函数。

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

问题

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

【问题讨论】:

    标签: python wsgi pyramid


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 赞成,因为我从你的回答中学到了重要的东西,我自己的回答中提到了实现目标的干净方式:)
    【解决方案2】:

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

    来自Pyramid Docs#Startup

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多