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服务器中的全局对象的主要内容,如果未能解决你的问题,请参考以下文章
如何在Ubuntu中将mod_wsgi安装到特定的python版本?