aliyun oss python sdk 如何设置连接池的大小?

有的时候,并发太高,会看到 oss 报错:Connection pool is full, discarding connection: xxxx.oss-cn-hangzhou-internal.aliyuncs.com

一开始以为是 aliyun oss 服务端的限制,限制了最大连接数

但是查阅 aliyun oss 的文档后发现,aliyun oss 服务端并没有这样的限制

所以,怀疑是 aliyun oss python sdk client 的问题


然后我问了一下 chatGPT

图片.png

有模有样,但是根本没有办法用

首先是根本没有 PoolManager

图片.png

再然后,Bucket 也没有 pool 参数

class Bucket(_Base):
    """用于Bucket和Object操作的类,诸如创建、删除Bucket,上传、下载Object等。

    用法(假设Bucket属于杭州区域) ::

        >>> import oss2
        >>> auth = oss2.Auth('your-access-key-id', 'your-access-key-secret')
        >>> bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', 'your-bucket')
        >>> bucket.put_object('readme.txt', 'content of the object')
        <oss2.models.PutObjectResult object at 0x029B9930>

    :param auth: 包含了用户认证信息的Auth对象
    :type auth: oss2.Auth

    :param str endpoint: 访问域名或者CNAME
    :param str bucket_name: Bucket名
    :param bool is_cname: 如果endpoint是CNAME则设为True;反之,则为False。

    :param session: 会话。如果是None表示新开会话,非None则复用传入的会话
    :type session: oss2.Session

    :param float connect_timeout: 连接超时时间,以秒为单位。

    :param str app_name: 应用名。该参数不为空,则在User Agent中加入其值。
        注意到,最终这个字符串是要作为HTTP Header的值传输的,所以必须要遵循HTTP标准。
    """

所以,我该怎么办?


还有一个子问题,就是 aliyun oss python sdk 连接 oss server 的时候,使用的是 HTTP 协议。那么这里的连接池,复用的应该不是 HTTP 层面的东西,而是 HTTP 底层的 TCP 连接,是吗?

阅读 3.7k
3 个回答

确实oss2库实际上在内部使用了连接池,而且默认大小为10。对于大多数用例来说,这应该足够了。如果你没有特殊需求,那么不需要自定义连接池,可以直接使用默认的配置。在这种情况下,你可以简化:

import oss2

def create_oss_client(endpoint, access_key_id, access_key_secret, bucket_name):
    auth = oss2.Auth(access_key_id, access_key_secret)
    
    service = oss2.Service(auth, endpoint)
    bucket = oss2.Bucket(auth, endpoint, bucket_name)
    
    return service, bucket

if __name__ == "__main__":
    endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
    access_key_id = "your_access_key_id"
    access_key_secret = "your_access_key_secret"
    bucket_name = "your_bucket_name"

    service, bucket = create_oss_client(endpoint, access_key_id, access_key_secret, bucket_name)

    # 现在你可以使用 `service` 和 `bucket` 对象来操作OSS服务和Bucket
    # 例如,列出Bucket中的对象
    for obj in oss2.ObjectIterator(bucket):
        print(obj.key)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题