You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:23:04