python wsgi服务器中的全局对象

Posted

技术标签:

【中文标题】python wsgi服务器中的全局对象【英文标题】:Global objects in python wsgi server 【发布时间】:2011-10-08 07:38:37 【问题描述】:

我在 python 中创建一个应用程序,它使用 Web 服务器为前端提供服务,在接受数据作为 Web 请求后,将任务转发到作业队列,该队列使用线程与主处理功能共享。

但问题是 python web 服务器试图导入自己来运行线程,并且在这个过程中,几乎每个请求都会创建一个新的作业队列,这破坏了逻辑。有什么方法可以在 python web 服务器中设置全局变量,因为 python Queue 是线程安全的,我假设它不会造成任何伤害。

(我尝试了两个Web服务器Flask和web.py)

【问题讨论】:

当您使用烧瓶时,您是否禁用了文件更改时脚本的自动重新加载?我想这是你的问题。 是的,我做了,但脚本正在导入自身以创建线程来处理请求。 【参考方案1】:

共享数据最好存储在数据库中。

如果您希望每个用户的会话都有一个全局变量,那么您希望将这些变量与会话数据一起存储:这里是 details for web.py 和 for flask。

如果您有一个正在处理队列的持久进程,您可能会考虑使用 FastCGI 运行您的服务器,您的 python 服务器可以在与您的 Web 服务器不同的实例中运行。查看如何配置FastCGI for web.py - 看看这是否合适。 Web 服务器将通过它自己的端口与 python 服务器通信,因此您的 python 服务器可以继续运行并维护任何全局数据。

[编辑]

由于您需要共享变量 - 您可以查看 flask.g 获取 flask,或查看 web.ctx 获取 web.py。我从来没有使用过它们——所以我不知道是否存在不良影响或性能问题。我看到an example here 在 web.py 中建议执行以下操作:

import web

def add_global_hook():
    g = web.storage("counter": 0)
    def _wrapper(handler):
        web.ctx.globals = g
        return handler()
    return _wrapper

class Hello:
    def GET(self):
        web.ctx.globals.counter += 1
        return "<h1>Counter: %d</h1>" % web.ctx.globals.counter

if __name__ == '__main__':
    urls = ("/", "Hello")
    app = web.application(urls, globals())
    app.add_processor(add_global_hook())
    app.run()

【讨论】:

我想共享python对象,所以排除数据库 我添加了一些我在 globals 上看到的信息 - 但我从未使用过这些,我不知道它的含义是什么。

以上是关于python wsgi服务器中的全局对象的主要内容,如果未能解决你的问题,请参考以下文章

python中的wsgi是什么?

Windows 7上的python wsgi

如何在Ubuntu中将mod_wsgi安装到特定的python版本?

没有外部服务器的 Python GraphQL Ariadne WSGI 示例

pyhton中的wsgi是什么?

python框架Django与WSGI