Từ những gì tôi hiểu từ tài liệu mô-đun lốc xoáy. Đó là tornado.gen.Task bao gồm tornado.gen.Callback và tornado.gen.Wait với mỗi cặp Callback/Wait được kết hợp với các khóa duy nhất. ..Tornado Async HTTP trả về kết quả gia tăng
@tornado.web.asynchronous
@tornado.gen.engine
def get(self):
http_client = AsyncHTTPClient()
http_client.fetch("http://google.com",
callback=(yield tornado.gen.Callback("google")))
http_client.fetch("http://python.org",
callback=(yield tornado.gen.Callback("python")))
http_client.fetch("http://tornadoweb.org",
callback=(yield tornado.gen.Callback("tornado")))
response = yield [tornado.gen.Wait("google"), tornado.gen.Wait("tornado"), tornado.gen.Wait("python")]
do_something_with_response(response)
self.render("template.html")
Vì vậy, mã ở trên sẽ nhận được tất cả phản hồi từ các URL khác nhau. Bây giờ những gì tôi thực sự cần thực hiện là trả lại phản hồi ngay khi một http_client trả về dữ liệu. Vì vậy, nếu 'tornadoweb.org' trả về dữ liệu đầu tiên, nó phải làm một self.write (respose) và một vòng lặp trong def get() nên tiếp tục đợi các http_clients khác hoàn thành. Bất kỳ ý tưởng nào về cách viết điều này bằng giao diện tornado.gen.
thực hiện Rất mơ hồ (và cú pháp không chính xác) về những gì tôi đang cố gắng để làm sẽ như thế này
class GenAsyncHandler2(tornado.web.RequestHandler):
@tornado.web.asynchronous
@tornado.gen.engine
def get(self):
http_client = AsyncHTTPClient()
http_client.fetch("http://google.com",
callback=(yield tornado.gen.Callback("google")))
http_client.fetch("http://python.org",
callback=(yield tornado.gen.Callback("python")))
http_client.fetch("http://tornadoweb.org",
callback=(yield tornado.gen.Callback("tornado")))
while True:
response = self.get_response()
if response:
self.write(response)
self.flush()
else:
break
self.finish()
def get_response(self):
for key in tornado.gen.availableKeys():
if key.is_ready:
value = tornado.gen.pop(key)
return value
return None