Python Asyncio并发调用非异步函数为何未陷入循环阻塞?
为什么你的Asyncio代码没有陷入阻塞?
嗨,我来帮你拆解这个问题的核心原因~
首先咱们先盯着你的calc函数看:
def calc(number): while True: return(number * number)
这里的while True看起来是个无限循环,但它根本没机会循环起来!因为return语句是缩进在while True的代码块里的——第一次进入循环,函数就直接返回了计算结果,循环体只执行了一次就结束了。所以这个calc其实是个瞬间就能完成的普通同步函数,完全不会占用事件循环的时间,自然不会阻塞整个程序。
再看你的两个异步函数one和two:它们每次调用完calc拿到结果后,都会执行await asyncio.sleep(0)。这个await是关键——它会告诉Asyncio事件循环:“我现在可以暂停一下,让其他任务跑一跑”。所以事件循环会在one暂停时切换到two执行,two暂停时再切回one,这样两个任务就能交替运行,实现你看到的并发打印效果。
如果想模拟你原本预期的“阻塞”情况,你得让calc真正进入无限循环才行,比如把return移到循环外面:
def calc(number): while True: pass # 这里才是真正的无限循环,会一直占用CPU return(number * number)
这时候calc会一直卡在无限循环里,事件循环被这个同步函数占满,根本没机会切换到另一个任务,程序就会彻底卡住,只能打印第一个任务的结果(甚至可能连打印都出不来,因为CPU全被循环占了)。
总结一下:你代码里的calc并没有真的执行无限循环,它是个瞬间完成的函数,再加上await asyncio.sleep(0)让事件循环能切换任务,所以两个异步函数才能顺畅地并发运行~
内容的提问来源于stack exchange,提问作者user1779646
相关产品推荐
相关产品推荐

