【问题标题】:running cherrypy application on gevent wsgi server在 gevent wsgi 服务器上运行 cherrypy 应用程序
【发布时间】:2011-02-22 02:44:41
【问题描述】:

我有一个现有的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()

【问题讨论】:

    标签: cherrypy gevent


    【解决方案1】:

    这个例子将一直有效,直到您在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,应该用 greenlet-local 替换 threadlocal“服务”对象。
    【解决方案2】:

    该示例运行良好。我确信 freenode 上的#gevent 会帮助您解决任何安装问题。

    【讨论】:

    • 是的,我确认了,因为樱桃树和应用程序对象确实包含一个 callable,所有这些都应该按预期工作......我也会检查 freenode 以进行远程测试平台。干杯!
    猜你喜欢
    • 2019-08-17
    • 2020-01-10
    • 2020-04-16
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    • 2017-04-11
    相关资源
    最近更新 更多