在document中,如果方法也用@ gen.coroutine修饰,则不需要@ web.asynchronous。像这样
@web.asynchronous
@gen.coroutine
def get(self):
...
但是,在文档中,他们还解释说如果你使用@ web.asynchronous,那么你应该调用self.finish()。但是,在上面的情况下(一起使用两个装饰器),连接完成时没有调用" self.finish()"
我想知道那里发生了什么。
和以下情况,它与上述不同。
@web.asynchronous
def get(self):
self.test()
@gen.coroutine
def test(self):
httpClient = AsyncHttpClient()
val = yield httpClient.fetch("http://www.google.com")
print test
#self.finish()
如果" self.finish()"未被称为连接未关闭。
有人可以解释一下吗?
答案 0 :(得分:8)
秘密是here:
if isinstance(result, Future):
# If @asynchronous is used with @gen.coroutine, (but
# not @gen.engine), we can automatically finish the
# request when the future resolves. Additionally,
# the Future will swallow any exceptions so we need
# to throw them back out to the stack context to finish
# the request.
def future_complete(f):
f.result()
if not self._finished:
self.finish()
IOLoop.current().add_future(result, future_complete)
@asychronous
检查返回未来的方法(即@gen.coroutine
),如果是,则添加IOLoop回调以在将来完成时完成连接。