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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 21:32:28