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

Python中使用asyncio运行两个无限循环函数仅执行第一个的问题

问题原因

asyncio的协程调度依赖协程主动让出执行权,只有当协程执行到await关键字时,事件循环才会调度其他等待运行的协程。你当前的代码存在两个问题:

  1. increment函数的死循环中没有任何await调用,协程进入该函数后会一直占用CPU执行money += 1逻辑,永远不会让出执行权,因此第二个displayMoney协程完全没有被调度的机会。
  2. displayMoney中调用的input是同步阻塞函数,就算协程能被调度,执行到input时整个事件循环都会被卡住,其他协程也无法继续运行。
解决方法
  • 给无限循环的计算逻辑添加主动让出执行权的调用:在increment的循环中添加await asyncio.sleep(0),该行代码会主动将执行权交还给事件循环,让其他待调度的协程获得运行机会。如果不需要极高的增量频率,也可以将参数调整为合适的秒数(比如0.01)来降低CPU占用。
  • 替换同步阻塞的IO操作为异步实现:标准库没有原生的异步输入方法,可使用第三方库aioconsole提供的ainput方法,也可以通过线程池封装同步input实现异步调用。

修改后的可运行代码如下:

import asyncio
import aioconsole # 需先执行pip install aioconsole安装依赖

money = 0

async def increment():
    global money
    while True:
        money += 1
        # 主动让出执行权,触发事件循环调度其他协程
        await asyncio.sleep(0)

async def displayMoney():
    global money
    while True:
        # 异步输入不会阻塞事件循环
        await aioconsole.ainput(f"当前money值:{money}\n")

async def main():
    await asyncio.gather(increment(), displayMoney())

asyncio.run(main())
适配socket聊天室场景说明

后续开发socket聊天室时,异步socket的读写操作(比如StreamReader.read()、StreamWriter.drain())本身就包含await调用,会自动让出执行权,不需要额外添加asyncio.sleep。只要保证所有IO操作都使用异步版本、避免在协程中调用同步阻塞方法,多个客户端处理协程就能正常并发运行。

内容的提问来源于stack exchange,提问作者TheAngriestCrusader

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 03:36:05