async with session.client("s3") as s3:
object = await s3.get_object(Key=key, Bucket=bucket)
body = object.get("Body")
for i in range(1000):
process_data(await body.read(i + 100))
我需要使用
aioboto3
下载一些大的 s3 文件。我是否正确地假设第一个 get_object 调用创建了一个连接,而对 body 的 read
调用实际上从 s3 读取数据?
如果我正在下载一个大的 s3 文件,并且上传了新版本,
read
调用是否仍会从同一版本的对象中读取?
是的,它创建到 S3 的连接并返回对该对象的引用。当您使用await body.read()时,实际的数据传输发生。
关于你的第二个问题:一旦你调用 get_object 并收到响应(其中包括对象的主体),该响应代表发出请求时存在的文件版本。这意味着对 Body 的后续读取调用将继续从您进行初始 get_object 调用时存在的版本中检索数据。
即使在读取过程中将对象的新版本上传到 S3,您的读取操作仍将从对象的原始版本继续。在 S3 中,您获得的版本在您请求时“锁定”。