我遗漏了一些小的,但非常关键的一点,为什么在Python中的并发性是非阻塞的. 我知道有一个调度器,它管理异步功能,并且并发性是协作的:异步功能应该将控制权交还给调度器,使其不会挂起(即非阻塞).
例如,我不明白的是,为什么asyncio.sleep()
是"非阻塞".如果它正在执行,则不能运行任何其他代码.请考虑以下示例:
import asyncio
from time import perf_counter
async def main():
# case A
start = perf_counter()
await asyncio.sleep(5) # task #1
await asyncio.sleep(5) # task #2
print(perf_counter() - start) # 10
# case B
start = perf_counter()
await asyncio.gather(*(
asyncio.sleep(5), asyncio.sleep(5)
))
print(perf_counter() - start) # 5
if __name__ == "__main__":
asyncio.run(main())
为什么调度程序调度 case B中的所有任务,使它们同时运行,而不调度 case A中的任务?
task #1
不是"阻塞"了程序的执行吗?(因为除了等待task #1
完成外,你什么也做不了)
在上面的例子中,我希望task #1
返回控制,这样task #2
将开始执行,但这并没有发生……为什么?因为循环忙于执行task #1
,所以无法开始执行task #2
?为什么gather()
没有发生同样的事情呢?