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

时间:2018-08-20 14:54:28

标签: python python-asyncio

嗨,我是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()?如果单线程一次只能做一件事情,那么其他工作还有谁做?

2 个答案:

答案 0 :(得分:2)

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

secondWorker只是睡眠这一事实意味着可用时间将用在subWorker中。

asyncio根据定义是单线程的;参见documentation

  

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

事件循环一次执行一个任务,例如在等待I / O时阻止了一个任务,或者自愿进入睡眠状态时切换。

答案 1 :(得分:2)

现在有点老了,但是我发现import { newUserEnv }文档中的可视化效果(在“同步与异步执行”下方大约1个屏幕下方)对于向同事传授异步流控制很有帮助: http://sdiehl.github.io/gevent-tutorial/

这里最重要的一点是,即使有许多程序正在执行中,但在任何时候都只有一个协程正在运行中。

相关问题