我使用Tornado和asyncio编写了异步程序,但是我已经意识到我不了解异步任务是如何表示他们已经完成的。
例如,让我们看看http://www.tornadoweb.org/en/stable/guide/async.html#examples中的异步提取。
到目前为止,我的理解是:
fetch
产生Future
时,处理程序被暂停。Future
通过http://www.tornadoweb.org/en/stable/ioloop.html#tornado.ioloop.IOLoop.add_future IOLoop
Future
完成,IOLoop
安排协程恢复,以便完成。我不明白的是第3步&#34中的Future
如何完成"并调用其done callback。我认为只有一个主题,那么Future
"如何在后台工作"并获得控制,以便它可以调用回调?
答案 0 :(得分:2)
IOLoop打开一个套接字到你正在取出的远程服务器,并将该套接字添加到一个文件描述符列表中,它使用epoll或类似系统等待IO调用
每当循环没有执行你的代码时 - 例如,当你的处理程序被yield
暂停时,循环正在等待IO,这里:
https://github.com/tornadoweb/tornado/blob/master/tornado/ioloop.py#L862
当它收到IO事件时 - 例如,当远程服务器发送一些响应字节时 - Tornado会找到等待该事件并执行它的回调。
有关事件循环的示例实现,请参阅A Web Crawler With asyncio Coroutines。