Torndao里@tornado.gen.coroutine和 @tornado.web.asynchronous用途在哪?
@tornado.web.asynchronous 我知道调用这个可以实现长连接,调用self.finish()结束
@tornado.gen.coroutine 这个实现异步
不知道我的理解对不对,为什么我看很多人都是这样写
@tornado.web.asynchronous
@tornado.gen.coroutine
def get(self):
# 获取各种参数
res = yield self.my_func()
self.write(str(res))
self.finish()
同时使用两者修饰有用意在哪?一直没弄懂
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
引用stackoverflow上的相关回答Why does the order of asynchronous and gen.coroutine matter in Tornado?
@asynchronous
会监听@gen.coroutine
的返回结果(Future
),并在@gen.coroutine
装饰的代码段执行完成后自动调用finish
。从Tornado 3.1版本开始,只使用@gen.coroutine
就可以了。所以,就有两种方式来调用:
你要想异步,就要保持长连接,否则你的handler执行完就自己return了,
tornado.web.asynchronous
的作用是保持长连接,也就是除非你主动调用self.finish()
方法,否则requestHandler
将不会返回。tornado.gen.coroutine
是使用协程的方式实现类似异步的处理效果。最新版的tornado,其实不一定需要写tornado.web.asynchronous
装饰器,例如官方的例子@tornado.web.asynchronous 异步
@tornado.gen.coroutine 并发
这两个按你的顺序写,第一个是没用的
至于这两个装饰器怎么用你可以试试,
比如你不写装饰器,在get里写个耗时的操作,同时发两次请求看看什么情况就清楚了。
楼主请参考github-tornado官方demos中一个为spider的项目
对这两者的使用具有参考性