嗨,我是异步和事件循环概念的新手(非阻塞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()
呢?如果单个线程一次只能做一件事,那么还有谁来做其他工作?
subWorker
和secondWorker
同时执行的假设是错误的。
secondWorker
只是睡觉的事实意味着可用时间将花费在subWorker
.
根据定义,asyncio
是单线程的;请参阅文档:
此模块提供用于编写单线程并发代码的基础结构
事件循环一次执行一个任务,例如,当一个任务在等待 I/O 时被阻塞时切换,或者像这里一样,自愿休眠。
这现在有点旧了,但我发现gevent
文档中的可视化(大约 1 个屏幕,在"同步和异步执行"下(在向同事教授异步流控制时很有帮助:http://sdiehl.github.io/gevent-tutorial/
这里最重要的一点是,任何时候只有一个协程在运行,即使可能有许多协程正在处理中。