[Python] Boto3でのスレッドセーフまとめ。3種類のオブジェクトこれだけ覚えておけばOK
こんにちは。サービス開発室の武田です。
以前Session
オブジェクトのスレッドセーフについて言及しました。よければこちらもご覧ください。
スレッドセーフまとめ
いきなりですがまとめです。Boto3のスレッドセーフについては、これを覚えておけばもう迷いません。
オブジェクト | マルチスレッド | マルチプロセス | 作成例 |
---|---|---|---|
client | Yes | No | ec2 = boto3.client("ec2") |
resource | No | No | s3 = boto3.resource("s3") |
session | No | No | session = boto3.session.Session() |
基本的にはclient
が唯一の(マルチスレッドにおける)スレッドセーフなオブジェクトです。しかしネットワーク実装の関係から、マルチプロセスでは使用しないのが無難なようです。つまりマルチプロセスでは、すべてのBoto3オブジェクトは共有できません。
clientについて補足
client
はそのまま使用する分にはスレッドセーフですが、一部注意しなければいけない点があります。こちらをドキュメントから引用します。
Shared Metadata: Clients expose metadata to the end user through a few attributes (namely meta, exceptions and waiter_names). These are safe to read but any mutations should not be considered thread-safe.
Custom Botocore Events: Botocore (the library Boto3 is built on) allows advanced users to provide their own custom event hooks which may interact with boto3’s client. The majority of users will not need to use these interfaces, but those that do should no longer consider their clients thread-safe without careful review.
簡単にまとめると、変更操作と独自のイベントフックを使用する場合は無条件にスレッドセーフではなくなるから気をつけましょうね。ということになります。
まとめ
Boto3を利用する上で、どれがスレッドセーフだったか確認することがままありました。結論としてはclient
のみがスレッドセーフということになります。