调用异步函数Acc.check触发RuntimeWarning:协程未被等待
解决异步函数未await的RuntimeWarning及代码问题
问题根源
直接调用异步函数Acc.check()只会生成一个协程对象,不会实际执行函数逻辑,必须通过await关键字或异步事件循环触发执行,这就是你收到RuntimeWarning: coroutine 'Acc.check' was never awaited的原因。
同时你的代码还有几个隐性问题需要修复:
read()异步函数没有返回值,导致data = await read()会得到NoneAcc.check()作为类方法缺少必要参数(实例方法需self,静态方法需加装饰器)- 逻辑错误:
user = data.keys()后判断str(user) not in data完全不符合预期,dict_keys转字符串后不可能匹配data中的键
修复步骤
正确执行异步函数
使用Python 3.7+内置的asyncio.run()来运行异步入口函数,它会自动创建和管理事件循环。修复
read()函数
当前代码是同步读文件,没必要用async,直接改成普通函数并返回读取到的数据;如果需要异步读文件,可以用aiofiles库实现真正的异步IO。修正类方法定义
如果check不需要访问类/实例属性,用@staticmethod装饰器将其转为静态方法;如果需要访问实例属性,则改为实例方法并传入self参数。修正逻辑错误
原代码意图生成一个不存在于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
相关产品推荐
相关产品推荐

