1

我正在从 S3 存储桶下载密钥列表,但我不知道有多少。我在 300,000 个键和 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
4

1 回答 1

1

不幸的是,Asyncio 在这里帮不了你。

首先也是最重要的boto3是,不知道异步;它不知道如何使用 asyncio 循环进行连接,它只在单个同步线程中工作。(当然,您可以使用多个线程或multiprocessing子进程来发出请求,但请看下面为什么这也无济于事。)

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

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

于 2019-04-23T11:45:52.500 回答