Python asyncio:单线程如何同时处理多个事情?



嗨,我是异步和事件循环概念的新手(非阻塞IO(

async def subWorker():
...
async def firstWorker():
await subWorker()

async def secondWorker():
await asyncio.sleep(1)

loop = asyncio.get_event_loop()
asyncio.ensure_future(firstWorker())
asyncio.ensure_future(secondWorker())
loop.run_forever()

在这里,当代码启动时,firstWorker()被执行并暂停,直到遇到await subWorker()。在firstWorker()等待的同时,secondWorker()开始了。

问题是,当firstWorker()遇到await subWorker()并暂停时,计算机将同时执行subWorker()secondWorker()。由于该程序现在只有 1 个线程,我想单个线程secondWorker()工作。那么谁来执行subWorker()呢?如果单个线程一次只能做一件事,那么还有谁来做其他工作?

subWorkersecondWorker同时执行的假设是错误的。

secondWorker只是睡觉的事实意味着可用时间将花费在subWorker.

根据定义,asyncio是单线程的;请参阅文档:

此模块提供用于编写单线程并发代码的基础结构

事件循环一次执行一个任务,例如,当一个任务在等待 I/O 时被阻塞时切换,或者像这里一样,自愿休眠。

这现在有点旧了,但我发现gevent文档中的可视化(大约 1 个屏幕,在"同步和异步执行"下(在向同事教授异步流控制时很有帮助:http://sdiehl.github.io/gevent-tutorial/

这里最重要的一点是,任何时候只有一个协程在运行,即使可能有许多协程正在处理中。

相关内容

最新更新