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

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

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

首先是根本没有 PoolManager

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

再然后,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 连接,是吗?


回答:

https://github.com/aliyun/aliyun-oss-python-sdk/blob/master/oss2/api.py

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

self.session = session or http.Session()

https://github.com/aliyun/aliyun-oss-python-sdk/blob/master/oss2/http.py

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

我们可以看到,其实,Session 对象是可以指定连接池的大小的,但是外层的 Bucket 对象没有传递这个参数

所以,我提交了一个 PR:https://github.com/aliyun/aliyun-oss-python-sdk/pull/336


回答:

确实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)


回答:

oss2.defaults.connection_pool_size = xxxx
https://github.com/aliyun/aliyun-oss-python-sdk/blob/master/CHANGELOG.rst#version-210

以上是 aliyun oss python sdk 如何设置连接池的大小? 的全部内容, 来源链接: utcz.com/p/938829.html

回到顶部