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
有模有样,但是根本没有办法用
首先是根本没有 PoolManager
再然后,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
self.session = session or http.Session()
https://github.com/aliyun/aliyun-oss-python-sdk/blob/master/oss2/http.py
我们可以看到,其实,Session 对象是可以指定连接池的大小的,但是外层的 Bucket 对象没有传递这个参数
所以,我提交了一个 PR:https://github.com/aliyun/aliyun-oss-python-sdk/pull/336
回答:
确实oss2库实际上在内部使用了连接池,而且默认大小为10。对于大多数用例来说,这应该足够了。如果你没有特殊需求,那么不需要自定义连接池,可以直接使用默认的配置。在这种情况下,你可以简化:
import oss2def 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