Я написал асинхронные программы с использованием Tornado и asyncio, однако я понял, что не понимаю, как асинхронные задачи говорят, что они сделаны.Как асинхронные задачи говорят, что они «сделаны», если есть один поток?
Например, давайте рассмотрим асинхронную выборку в http://www.tornadoweb.org/en/stable/guide/async.html#examples.
Мое понимание до сих пор является:
- Обработчик приостанавливается, когда
fetch
даетFuture
. Future
добавляет кIOLoop
с помощью http://www.tornadoweb.org/en/stable/ioloop.html#tornado.ioloop.IOLoop.add_future- В
Future
заканчивается, иIOLoop
расписания сопрограмм быть реанимированы, чтобы он мог завершить.
Что я не понимаю, так это то, как Future
в шаге 3 «заканчивается» и вызывает его done callback. Я думал, что есть только один поток, так как Future
«работает в фоновом режиме» и получит контроль, чтобы он мог вызвать обратный вызов?