异步任务如何表示他们已完成"如果有一个线程?

时间:2016-08-15 14:24:35

标签: asynchronous tornado python-asyncio concurrent.futures ioloop

我使用Tornado和asyncio编写了异步程序,但是我已经意识到我不了解异步任务是如何表示他们已经完成的。

例如,让我们看看http://www.tornadoweb.org/en/stable/guide/async.html#examples中的异步提取。

到目前为止,我的理解是:

  1. fetch产生Future时,处理程序被暂停。
  2. Future通过http://www.tornadoweb.org/en/stable/ioloop.html#tornado.ioloop.IOLoop.add_future
  3. 添加到IOLoop
  4. Future完成,IOLoop安排协程恢复,以便完成。
  5. 我不明白的是第3步&#34中的Future如何完成"并调用其done callback。我认为只有一个主题,那么Future"如何在后台工作"并获得控制,以便它可以调用回调?

1 个答案:

答案 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