gpt4 book ai didi

python - 如何在 tornado.wsgi.WSGIContainer 中使用异步 tornado API?

转载 作者:太空宇宙 更新时间:2023-11-04 10:39:36 30 4
gpt4 key购买 nike

我尝试使用自定义的 WSGIContainer 来处理异步操作:

from tornado import httpserver, httpclient, ioloop, wsgi, gen

@gen.coroutine
def try_to_download():
response = yield httpclient.AsyncHTTPClient().fetch("http://www.stackoverflow.com/")
raise gen.Return(response.body)


def simple_app(environ, start_response):
res = try_to_download()

print 'done: ', res.done()
print 'exec_info: ', res.exc_info()

status = "200 OK"
response_headers = [("Content-type", "text/html")]
start_response(status, response_headers)
return ['hello world']


container = wsgi.WSGIContainer(simple_app)
http_server = httpserver.HTTPServer(container)
http_server.listen(8888)
ioloop.IOLoop.instance().start()

但这行不通。似乎应用程序不等待 try_to_download 函数结果。下面的代码也不起作用:

from tornado import httpserver, httpclient, ioloop, wsgi, gen


@gen.coroutine
def try_to_download():
yield gen.Task(httpclient.AsyncHTTPClient().fetch, "http://www.stackoverflow.com/")


def simple_app(environ, start_response):

res = try_to_download()
print 'done: ', res.done()
print 'exec_info: ', res.exc_info()

status = "200 OK"
response_headers = [("Content-type", "text/html")]
start_response(status, response_headers)
return ['hello world']


container = wsgi.WSGIContainer(simple_app)
http_server = httpserver.HTTPServer(container)
http_server.listen(8888)
ioloop.IOLoop.instance().start()

您知道为什么它不起作用吗?我使用的 Python 版本是 2.7。

附言你可能会问我为什么不想使用原生的tornado.web.RequestHandler。主要原因是我有自定义 python 库 (WsgiDAV),它生成 WSGI 接口(interface)并允许编写自定义适配器,我可以将其设为异步。

最佳答案

WSGI 不适用于异步。

一般来说,对于等待 Tornado 协程完成的函数,函数本身必须是协程并且必须yield协程的结果:

@gen.coroutine
def caller():
res = yield try_to_download()

但是像 simple_app 这样的 WSGI 函数当然不能是协程,因为 WSGI 不理解协程。 Bottle documentation 中对 WSGI 和异步之间的不兼容性进行了更详尽的解释。 .

如果你必须支持 WSGI,不要使用 Tornado 的 AsyncHTTPClient,使用像标准的同步客户端 urllib2或 PyCurl 代替。如果您必须使用 Tornado 的 AsyncHTTPClient,请不要使用 WSGI。

关于python - 如何在 tornado.wsgi.WSGIContainer 中使用异步 tornado API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21459642/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com