Asynchronous 异步任务如何表示它们';关于;“完成”;如果有';有一根线吗?
我用Tornado和asyncio编写了异步程序,但是我意识到我不明白异步任务是如何完成的Asynchronous 异步任务如何表示它们';关于;“完成”;如果有';有一根线吗?,asynchronous,tornado,python-asyncio,concurrent.futures,ioloop,Asynchronous,Tornado,Python Asyncio,Concurrent.futures,Ioloop,我用Tornado和asyncio编写了异步程序,但是我意识到我不明白异步任务是如何完成的 例如,让我们来看看异步获取。 到目前为止,我的理解是: 当fetch生成一个Future时,处理程序将挂起 Future通过 Future完成,而IOLoop计划重新激活协同程序,以便它能够完成 我不明白的是,第3步中的Future是如何“完成”并调用它的。我以为只有一个线程,那么未来的如何在后台工作并获得控制权以便调用回调呢?IOLoop会打开一个到远程服务器的套接字,然后将该套接字添加到文件描述符列表
例如,让我们来看看异步获取。
到目前为止,我的理解是:fetch
生成一个Future
时,处理程序将挂起Future
通过Future
完成,而IOLoop
计划重新激活协同程序,以便它能够完成我不明白的是,第3步中的
Future
是如何“完成”并调用它的。我以为只有一个线程,那么未来的如何在后台工作并获得控制权以便调用回调呢?IOLoop会打开一个到远程服务器的套接字,然后将该套接字添加到文件描述符列表中,在该列表中它正在等待IO使用或类似的系统调用
每当循环不执行代码时——例如,当处理程序被yield
暂停时,循环将等待IO,如下所示:
当它接收到IO事件时(例如,当远程服务器发送一些响应字节时),Tornado会找到等待该事件的回调并执行它
有关事件循环的示例实现,请参见