Tôi cố gắng sử dụng WSGIContainer tùy chỉnh để xử lý các hoạt động không đồng bộ:
từ cơn lốc xoáy nhập httpserver, httpclient, ioloop, wsgi, gen
@gen.coroutine
chắc chắn try_to_download():
phản hồi = năng suất httpclient.AsyncHTTPClient().fetch("http://www.stackoverflow.com/")
nâng cao gen.Return(response.body)
def simple_app(environ, start_response):
res = try_to_download()
print 'xong:', res.done()
in 'exec_info: ', res.exc_info()
trạng thái = "200 được"
reply_headers = [("Loại nội dung", "văn bản/html")]
start_response(trạng thái, reply_headers)
trở lại ['xin chào thế giới']
container = wsgi.WSGIContainer(simple_app)
http_server = httpserver.HTTPServer(container)
http_server.listen(8888)
ioloop.IOLoop.instance().start()
Nhưng điều này không hiệu quả. Có vẻ như ứng dụng không chờ đợi thử_to_tải xuống kết quả hàm Mã bên dưới cũng không hoạt động:
từ cơn lốc xoáy nhập httpserver, httpclient, ioloop, wsgi, gen
@gen.coroutine
chắc chắn try_to_download():
mang lại gen.Task(httpclient.AsyncHTTPClient().fetch, "http://www.stackoverflow.com/")
def simple_app(environ, start_response):
res = try_to_download()
print 'xong:', res.done()
in 'exec_info: ', res.exc_info()
trạng thái = "200 được"
reply_headers = [("Loại nội dung", "văn bản/html")]
start_response(trạng thái, reply_headers)
trở lại ['xin chào thế giới']
container = wsgi.WSGIContainer(simple_app)
http_server = httpserver.HTTPServer(container)
http_server.listen(8888)
ioloop.IOLoop.instance().start()
Bạn có biết tại sao nó không hoạt động? Phiên bản Python tôi đang sử dụng là 2.7.
P.S. bạn có thể hỏi tôi tại sao tôi không muốn sử dụng ngôn ngữ gốccơn lốc xoáy.web.RequestHandler. Lý do chính là tôi có thư viện python tùy chỉnh (WsgiDAV) tạo giao diện WSGI và cho phép viết các bộ điều hợp tùy chỉnh mà tôi có thể tạo không đồng bộ.
WSGI không hoạt động với async.
Nói chung, để một hàm chờ coroutine Tornado hoàn thành thì bản thân hàm đó phải là một coroutine và phảinăng suất
Kết quả của coroutine:
@gen.coroutine
người gọi def():
res = năng suất try_to_download()
Nhưng thích ứng dụng đơn giản
Tất nhiên, hàm WSGI như vậy không thể là coroutine, vì WSGI không hiểu coroutine. Tài liệu về chai Sự không tương thích giữa WSGI và async được giải thích chi tiết hơn trong . .
Nếu bạn phải hỗ trợ WSGI, đừng sử dụng AsyncHTTPClient của Tornado, hãy sử dụng ứng dụng khách đồng bộ tiêu chuẩn như urllib2Hoặc thay vào đó là PyCurl. Nếu bạn phải sử dụng AsyncHTTPClient của Tornado, đừng sử dụng WSGI.
Tôi là một lập trình viên xuất sắc, rất giỏi!