在gevent WSGI服务器上运行CherryPy应用程序

5

我有一个已经存在的cherrypy应用,但我想知道是否可能在gevent wsgi服务器上运行它。我想我可以这样做,但我没有访问Linux服务器来测试gevent,也不能在我的Mac上运行它。

我认为这是可能的,因为每一方都遵循wsgi规范。

有人尝试过吗?

我想示例看起来像下面这样:

import cherrypy 
from gevent import wsgi

class Root(object):
     def index(self):
        return "hi!"
     index.exposed = True

app = cherrypy.tree.mount(Root(), '/')
wsgi.WSGIServer(('', 8088), app).serve_forever()
2个回答

3

这个例子可以正常工作,直到你在cherrypy处理程序内遇到greenlet切换!因此,如果您在处理程序内使用gevent进行异步通信,则会失败。

cherrypy使用全局对象来存储响应和标头,它们位于cherrypy/__init__.py中的第350行:

# Create request and response object (the same objects will be used
#   throughout the entire life of the webserver, but will redirect
#   to the "serving" object)
request = _ThreadLocalProxy('request')
response = _ThreadLocalProxy('response')

如果您暂停一个请求,并且gevent切换到处理下一个请求,它将覆盖全局对象中的content-length标头,这将导致客户端出现奇怪的错误。

确实。如果想要使用greenlets,有人应该将threadlocal“serving”对象替换为greenlet-local对象。 - fumanchu

2

那个例子运行良好。我相信Freenode上的#gevent会帮助您解决任何安装问题。


是的,我确认了由于樱花树和应用程序对象都包含_callable_,所以一切都应该按预期工作...我还会在freenode上检查远程测试平台。干杯! - deecodameeko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接