是boto3客户端线程安全

And*_*sad 9 python amazon-s3 aws-sdk boto3

对于S3线程安全,boto3是低级客户端吗?文档没有明确说明.

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#client

Github讨论了类似的问题

https://github.com/boto/botocore/issues/1246

但仍然没有维护者的回答.

Ska*_*kam 10

如果您查看boto3 的多线程/处理文档,您可以看到他们为每个会话推荐一个客户端,因为实例之间存在可以由各个线程进行突变的共享数据.

对于这个确切的问题,它看起来还有一个开放的github问题.https://github.com/boto/botocore/issues/1246

  • 不幸的是,[多线程/处理](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/resources.html?highlight=multithreading#multithreading-multiprocessing)说明了Resource实例。没有明确提及会话或低级客户端。 (4认同)

Paw*_*wel 8

我最近尝试使用单个 boto 客户端实例使用 concurrent.futures.ThreadPoolExecutor. 我遇到了来自 boto 的异常。在这种情况下,我认为 boto 客户端不是线程安全的。

我得到的例外

  File "xxx/python3.7/site-packages/boto3/session.py", line 263, in client
    aws_session_token=aws_session_token, config=config)
  File "xxx/python3.7/site-packages/botocore/session.py", line 827, in create_client
    endpoint_resolver = self._get_internal_component('endpoint_resolver')
  File "xxx/python3.7/site-packages/botocore/session.py", line 694, in _get_internal_component
    return self._internal_components.get_component(name)
  File "xxx/python3.7/site-packages/botocore/session.py", line 906, in get_component
    del self._deferred[name]
Run Code Online (Sandbox Code Playgroud)

  • 奇怪的是,当我在线程函数内初始化 boto3 客户端时,我得到了这个 credential_provider 异常,但是当它们都使用全局初始化的相同客户端时,它可以工作 (4认同)
  • 相同,缺少实际的异常:) `KeyError: 'credential_provider'` (2认同)
  • @LobsterMan 是的,但是那一刻风是朝哪个方向吹的? (2认同)

小智 5

文档

低级客户端是线程安全的。使用低级客户端时,建议实例化您的客户端,然后将该客户端对象传递给您的每个线程。

客户端的实例化不是线程安全的,而实例是线程安全的。为了使事情在多线程环境中工作,将实例化放在全局锁中,如下所示:

boto3_client_lock = threading.Lock()

def create_client():
    with boto3_client_lock:
        return boto3.client('s3', aws_access_key_id='your key id', aws_secret_access_key='your access key')
Run Code Online (Sandbox Code Playgroud)

  • 正确的链接https://boto3.amazonaws.com/v1/documentation/api/latest/guide/clients.html。来自文档:与资源和会话不同,客户端通常是线程安全的。不过,有一些警告需要注意,如下所述。 (3认同)