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

调用异步函数Acc.check触发RuntimeWarning:协程未被等待

解决异步函数未await的RuntimeWarning及代码问题

问题根源

直接调用异步函数Acc.check()只会生成一个协程对象,不会实际执行函数逻辑,必须通过await关键字或异步事件循环触发执行,这就是你收到RuntimeWarning: coroutine 'Acc.check' was never awaited的原因。

同时你的代码还有几个隐性问题需要修复:

  • read()异步函数没有返回值,导致data = await read()会得到None
  • Acc.check()作为类方法缺少必要参数(实例方法需self,静态方法需加装饰器)
  • 逻辑错误:user = data.keys()后判断str(user) not in data完全不符合预期,dict_keys转字符串后不可能匹配data中的键

修复步骤

  1. 正确执行异步函数
    使用Python 3.7+内置的asyncio.run()来运行异步入口函数,它会自动创建和管理事件循环。

  2. 修复read()函数
    当前代码是同步读文件,没必要用async,直接改成普通函数并返回读取到的数据;如果需要异步读文件,可以用aiofiles库实现真正的异步IO。

  3. 修正类方法定义
    如果check不需要访问类/实例属性,用@staticmethod装饰器将其转为静态方法;如果需要访问实例属性,则改为实例方法并传入self参数。

  4. 修正逻辑错误
    原代码意图生成一个不存在于data中的8位随机用户ID,应该循环生成随机字符串,直到生成的ID不在data的键集合中。

修正后的完整代码

import json
import random
import asyncio

# -- Functions --
def read():  # 同步读文件,无需async
    with open("data.json", "r") as f:
        return json.load(f)

# -- Commands --
class Acc:
    @staticmethod
    async def check():
        data = read()  # 同步函数直接调用,无需await

        # 生成不重复的8位随机用户ID
        while True:
            numbers = "0123456789"  # 补上原代码缺失的数字7
            user_id = "".join(random.sample(numbers, 8))
            if user_id not in data:
                break

        data[user_id] = {}

        with open("data.json", "w") as f:
            json.dump(data, f, indent=4)

# 通过asyncio.run执行异步函数
asyncio.run(Acc.check())

如果需要异步文件操作(如处理大文件场景),可以先安装aiofiles(pip install aiofiles),再修改read()为:

import aiofiles

async def read():
    async with aiofiles.open("data.json", "r") as f:
        return json.loads(await f.read())

此时Acc.check()中需改为data = await read()。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 21:48:27