嗨,我对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()
。因为程序现在只有一个线程,我猜单个线程可以secondWorker()
工作。那么谁来执行subWorker()
?如果单个线程一次只能做一件事,那么还有谁做其他的工作?你知道吗
subWorker
和secondWorker
同时执行的假设是错误的。你知道吗事实上,
secondWorker
只是睡眠,这意味着可用的时间将花费在subWorker
。你知道吗asyncio
定义为单线程;请参见documentation:事件循环一次执行一个任务,例如当一个任务在等待I/O时被阻塞,或者像这里一样,自动休眠时进行切换。你知道吗
这现在有点旧了,但是我发现
gevent
文档中的可视化(大约在“Synchronous&Asynchronous Execution”下面的1个屏幕)在向同事教授异步流控制时非常有用:http://sdiehl.github.io/gevent-tutorial/这里最重要的一点是,在任何时候只有一个协程运行,即使许多协程可能在进程中。你知道吗
相关问题 更多 >
编程相关推荐