作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在从 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=True
和 NextContinuationToken
,您可以使用它来获取下一页结果。
您无法预测 ContinuationToken
的序列,因此无法通过继续 token 来并行化事物。
如果您确实了解您要查找的前缀的更多信息,则可以通过这些前缀进行并行化 - 例如,如果您正在查找前缀'aaa/bbb'
并且您知道其下的键可能是 aaa/bbb/0...
、aaa/bbb/1...
、aaa/bbb/2...
,您可以并行执行这些查询,以提高性能。
关于python - 如何使用 asyncio 循环遍历不确定长度的迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55810043/
我是一名优秀的程序员,十分优秀!