python - 无法理解tornado的异步
高洛峰
高洛峰 2017-04-17 17:35:07
[Python讨论组]

看了一些tornado异步的实现,我发现,人们在使用异步非阻塞特性的时候都是使用的线程的能提供异步的package,比如tornado.httpclient.HTTPClient(),但是我要怎样才能将自己的一个耗时函数(比如下面的sleep)变成异步非阻塞呢,代码如下

class MainHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    @tornado.gen.coroutine
    def get(self):
        tornado.ioloop.IOLoop.instance().add_callback(self.sleep)
        self.finish('OK')
        
    def sleep(self):
        for i in range(100000000):
            if i % 100000 == 0:
                print(i)
        print('ooo')

当用该handler处理请求时,能立即返回'OK'表示异步能实现,但是在处理sleep的时候却不能处理其他的请求,其他请求会被阻塞知道之前这个请求处理完毕。请问各位大牛有什么方法将自己写的耗时函数变成异步非阻塞呢(不使用线程池,既然异步是tornado的特性,应该是有方法的撒)?

这和tornado的单线程循环有关吗?

理解错了异步、阻塞和并发,tornado确实能做到异步和非阻塞,但是单线程怎样做到并发呢,当第一个请求过来tornado返回过后,后台还在处理耗时任务,此时如果有其他请求过来,其他请求会处于一直等待的状态,这不是表明无法并行吗?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(2)
ringa_lee

http://www.tornadoweb.org/en/stable/gen....

自己的耗时操作可以用tornado.gen.Task来实现异步,你的函数会收到一个callback参数,当任务完成时,调用callback。

PHP中文网

异步就是在做某事之前做另外一件事。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号