扫码关注官方订阅号
业精于勤,荒于嬉;行成于思,毁于随。
关键词: Linux epoll
用了epoll kqueue这类IO多路复用的调用.
非阻塞这部分代码主要就在ioloop.py里
例如你要等待某个IO, 就往ioloop里注册一个handler, ioloop一直在运行(阻塞在epoll之类的调用上、但不会阻塞在某个IO上), 当其中某个io可读/可写的时候, ioloop会调用你注册的handler(例如 TCPServer 注册的_handle_connection)
_handle_connection
注册handler可以看ioloop.py里 PollIOLoop 的 add_handler 函数IOLoop的执行可以看 PollIOLoop 的 start 函数
PollIOLoop
add_handler
start
其实至此已经具备了异步非阻塞的server。 gen、 future之类的库, 应该是为了简化异步代码的编写
gen
future
Future 只是一个代理,本质上是一个异步任务,运行完成后把自己的运行结果保存在future 里。
tornado 的ioloop会循环检查每一个yield 出去的future ,在future 被设置为运行结束后,由于加上yield的函数是一个生成器,因此可以通过.send()对该函数设置yield的返回值,让程序回去继续执行,这样你就可以在代码中写类似于result = yield execute("select * from users")这样的代码了
.send()
result = yield execute("select * from users")
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
关键词: Linux epoll
用了epoll kqueue这类IO多路复用的调用.
非阻塞这部分代码主要就在ioloop.py里
例如你要等待某个IO, 就往ioloop里注册一个handler, ioloop一直在运行(阻塞在epoll之类的调用上、但不会阻塞在某个IO上), 当其中某个io可读/可写的时候, ioloop会调用你注册的handler(例如 TCPServer 注册的
_handle_connection)注册handler可以看ioloop.py里
PollIOLoop的add_handler函数IOLoop的执行可以看
PollIOLoop的start函数其实至此已经具备了异步非阻塞的server。
gen、future之类的库, 应该是为了简化异步代码的编写Future 只是一个代理,本质上是一个异步任务,运行完成后把自己的运行结果保存在future 里。
tornado 的ioloop会循环检查每一个yield 出去的future ,在future 被设置为运行结束后,由于加上yield的函数是一个生成器,因此可以通过
.send()对该函数设置yield的返回值,让程序回去继续执行,这样你就可以在代码中写类似于result = yield execute("select * from users")这样的代码了