tornado调用一系列阻塞的方法时候如何保持异步的效果呢?

发布于 2022-09-04 11:28:02 字数 69 浏览 15 评论 0

用tornado开发restful服务,需要调用已有的诸多函数。怎样保持tornado的异步方式,是否需要对现有函数做修改?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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

评论(2

蓝天 2022-09-11 11:28:02

一般情况下,只会对原有函数中操作耗时的处理进行异步装饰,例如网络请求

from tornado.gen import coroutine, Future, Return
@coroutine                           # 首先是协程装饰器
def http_request(url):
    response = yield get_url(url)    # yield 调用
    ...

需要注意的是,一旦使用异步,那调用到的函数返回值必须是Future类型或者使用croutineReturn()返回。

例如上面用到的get_url方法,要用以下的方式返回结果

def get_url(url):
    future = Future()
    ...
    return future
    
@coroutine
def get_url(url):
    ...
    raise Return(result) # 这里的result是获取到的结果

异步虽然好用,但是缺点就是一旦用了,调用的时候都要考虑异步,风格要一致…

累赘 2022-09-11 11:28:02

如果是阻塞方法,应该丢给外部队列比如celery去处理,不要使用多线程worker。
如果是网络io导致的阻塞,可以利用tornado 的asyncHttpClient,将阻塞请求变为非阻塞

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