python - Tornado的异步非阻塞到底是怎么实现的呢?
迷茫
迷茫 2017-04-18 10:08:04
[Python讨论组]
迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(3)
ringa_lee

关键词: Linux epoll

PHP中文网

用了epoll kqueue这类IO多路复用的调用.

非阻塞这部分代码主要就在ioloop.py里

例如你要等待某个IO, 就往ioloop里注册一个handler, ioloop一直在运行(阻塞在epoll之类的调用上、但不会阻塞在某个IO上), 当其中某个io可读/可写的时候, ioloop会调用你注册的handler(例如 TCPServer 注册的_handle_connection)

注册handler可以看ioloop.py里 PollIOLoopadd_handler 函数
IOLoop的执行可以看 PollIOLoopstart 函数

其实至此已经具备了异步非阻塞的server。 genfuture之类的库, 应该是为了简化异步代码的编写

PHP中文网

Future 只是一个代理,本质上是一个异步任务,运行完成后把自己的运行结果保存在future 里。

tornado 的ioloop会循环检查每一个yield 出去的future ,在future 被设置为运行结束后,由于加上yield的函数是一个生成器,因此可以通过.send()对该函数设置yield的返回值,让程序回去继续执行,这样你就可以在代码中写类似于result = yield execute("select * from users")这样的代码了

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

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