我已經編寫了使用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 - 的
Future
完成加入IOLoop
,並且IOLoop
時間表被重新加進的協程,因此它可以完成。
我不明白的是Future
如何在第3步「完成」並調用其done callback。我以爲只有一個線程,那麼Future
將如何「在後臺工作」並獲得控制權,以便能夠調用回調函數?