Torndao里@tornado.gen.coroutine和 @tornado.web.asynchronous用途在哪?

发布于 2022-09-01 07:30:17 字数 319 浏览 10 评论 0

@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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

昔梦 2022-09-08 07:30:17

引用stackoverflow上的相关回答Why does the order of asynchronous and gen.coroutine matter in Tornado?

Order matters because @asynchronous looks at the Future returned by @gen.coroutine, and calls finish for you when the coroutine returns. Since Tornado 3.1, the combination of @asynchronous and @gen.coroutine has been unnecessary and discouraged; in most cases you should use @gen.coroutine alone.

@asynchronous会监听@gen.coroutine的返回结果(Future),并在@gen.coroutine装饰的代码段执行完成后自动调用finish。从Tornado 3.1版本开始,只使用@gen.coroutine就可以了。

所以,就有两种方式来调用:

# -----------调用方式1---------------------
# 采用两种装饰器的组合,finish会自动被调用
@web.asynchronous
@gen.coroutine
def get(self):
    # ...some code...
    self.write('...')
# -----------调用方式2---------------------
@tornado.web.asynchronous
def get(self):
    self.my_func()

@tornado.gen.coroutine
def my_func(self):
    # ...some code...
    self.write('...')
    self.finish() # 此处需要手动调用finish
亚希 2022-09-08 07:30:17

你要想异步,就要保持长连接,否则你的handler执行完就自己return了,

数理化全能战士 2022-09-08 07:30:17

tornado.web.asynchronous的作用是保持长连接,也就是除非你主动调用self.finish()方法,否则requestHandler将不会返回。

tornado.gen.coroutine是使用协程的方式实现类似异步的处理效果。最新版的tornado,其实不一定需要写tornado.web.asynchronous装饰器,例如官方的例子

你与清晨阳光 2022-09-08 07:30:17

@tornado.web.asynchronous 异步
@tornado.gen.coroutine 并发

这两个按你的顺序写,第一个是没用的

至于这两个装饰器怎么用你可以试试,
比如你不写装饰器,在get里写个耗时的操作,同时发两次请求看看什么情况就清楚了。

捂风挽笑 2022-09-08 07:30:17

楼主请参考github-tornado官方demos中一个为spider的项目

对这两者的使用具有参考性

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文