嗨,我是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()
?如果单线程一次只能做一件事情,那么其他工作还有谁做?
答案 0 :(得分:2)
subWorker
和secondWorker
同时执行的假设是错误的。
secondWorker
只是睡眠这一事实意味着可用时间将用在subWorker
中。
asyncio
根据定义是单线程的;参见documentation:
此模块提供了用于编写单线程并发代码的基础结构
事件循环一次执行一个任务,例如在等待I / O时阻止了一个任务,或者自愿进入睡眠状态时切换。
答案 1 :(得分:2)
现在有点老了,但是我发现import { newUserEnv }
文档中的可视化效果(在“同步与异步执行”下方大约1个屏幕下方)对于向同事传授异步流控制很有帮助: http://sdiehl.github.io/gevent-tutorial/
这里最重要的一点是,即使有许多程序正在执行中,但在任何时候都只有一个协程正在运行中。