Python3.8升级后aiobotocore创建SQS客户端报AttributeError问题
问题原因
你遇到的错误核心在于 aiobotocore 的 create_client 方法是异步协程,但你的代码直接返回了未执行的协程上下文(ClientCreatorContext 对象),没有通过 await 获取真正的 SQS Client 实例。这就导致后续调用 send_message 时,对象没有该方法,同时触发协程未被 await 的警告。
解决步骤
1. 修改客户端创建函数为异步函数
将 _create_sqs_client 改为异步函数,并在调用 create_client 时添加 await:
from aiobotocore.session import get_session async def _create_sqs_client(): ''' Creates an SQS client using our botocore session. ''' session = get_session() # 必须 await create_client 才能获取真实的 SQS Client return await session.create_client( 'sqs', **_connection_details )
2. 异步初始化 SQS Client
不能直接同步赋值 sqs_client = _create_sqs_client(),需要在异步上下文(比如类的异步初始化/setup 方法)中通过 await 获取实例:
# 以你的 SQSWrapper 类为例,添加异步初始化逻辑 class SQSWrapper: def __init__(self): # 不要在这里直接初始化,留到异步方法中 self.sqs_client = None async def setup(self): # 异步获取 SQS Client self.sqs_client = await _create_sqs_client() # 发送消息的方法保持异步 async def send(self, message): if not self.sqs_client: # 如果未初始化,先执行 setup await self.setup() coro = self.sqs_client.send_message( QueueUrl=await self._get_queue_url(), MessageBody=self.dumps(message.data) ) result = await asyncio.wait_for(coro, self.API_TIMEOUT) return result
3. 在程序入口处异步启动
确保你的程序入口是异步上下文,比如:
import asyncio async def main(): wrapper = SQSWrapper() await wrapper.setup() # 后续使用 wrapper 发送消息 if __name__ == "__main__": asyncio.run(main())
补充说明
- 旧版本
aiobotocore在 Python 3.6 环境下可能允许同步调用create_client,但升级后(适配 Python 3.8 的新版本)严格遵循异步规范,必须通过await获取 Client。 - 你为每个队列创建独立 Client 的逻辑是可行的,只要每个 Client 都通过上述异步方式正确初始化即可。
内容的提问来源于stack exchange,提问作者nimi
相关产品推荐
相关产品推荐

