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

2024-04-25 22:03:55 发布

您现在位置: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()。因为程序现在只有一个线程,我猜单个线程可以secondWorker()工作。那么谁来执行subWorker()?如果单个线程一次只能做一件事,那么还有谁做其他的工作?你知道吗


Tags: ioloopasyncio概念asyncdef事件future
2条回答

subWorkersecondWorker同时执行的假设是错误的。你知道吗

事实上,secondWorker只是睡眠,这意味着可用的时间将花费在subWorker。你知道吗

asyncio定义为单线程;请参见documentation

This module provides infrastructure for writing single-threaded concurrent code

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

这现在有点旧了,但是我发现gevent文档中的可视化(大约在“Synchronous&Asynchronous Execution”下面的1个屏幕)在向同事教授异步流控制时非常有用:http://sdiehl.github.io/gevent-tutorial/

这里最重要的一点是,在任何时候只有一个协程运行,即使许多协程可能在进程中。你知道吗

相关问题 更多 >