gpt4 book ai didi

python - 如何使用 asyncio 循环遍历不确定长度的迭代器

转载 作者:行者123 更新时间:2023-12-01 07:58:56 25 4
gpt4 key购买 nike

我正在从 S3 存储桶下载 key 列表,但我不知道有多少个。我在 300,000 个 key 和 5 分钟后停止了我的进程,我想使用 asyncio(我只是一个初学者。我用它下载了一次预定的 URL 列表)来加快进程。

我当前的同步功能如下:

def get_keys(s3, bucket_name, prefix):
# s3 previously defined by boto3.resource('s3') with AWS key and secret key as kwargs
bucket = s3.Bucket(bucket_name)
keys = []
for item in bucket.objects.filter(Prefix=prefix):
keys.append(item.key)
return keys

最佳答案

不幸的是,Asyncio 在这里无法为您提供帮助。

首先也是最重要的是,boto3 不支持 asyncio;它不知道如何使用 asyncio 循环进行连接,它只是在单个同步线程中工作。 (当然,您可以使用多个线程或多处理子进程来发出请求,但请参阅下面为什么这也没有帮助。)

底层 S3 函数调用 .objects.filter 的作用是 list_objects_v2 ,它允许每个请求列出最多 1000 个键。如果返回的键超过 1000 个,结果值将包含 IsTruncated=TrueNextContinuationToken,您可以使用它来获取下一页结果。
您无法预测 ContinuationToken 的序列,因此无法通过继续 token 来并行化事物。

如果您确实了解您要查找的前缀的更多信息,则可以通过这些前缀进行并行化 - 例如,如果您正在查找前缀'aaa/bbb' 并且您知道其下的键可能是 aaa/bbb/0...aaa/bbb/1...aaa/bbb/2...,您可以并行执行这些查询,以提高性能。

关于python - 如何使用 asyncio 循环遍历不确定长度的迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55810043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com