在Python中并行下载多个S3对象

2024-09-27 20:18:52 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有办法在Python3中使用boto3并发下载S3文件? 我知道aiobotocore库,但我想知道是否有方法使用标准boto3库来实现它。在


Tags: 文件方法标准s3boto3python3aiobotocore办法
2条回答

添加到上面的注释中,您应该使用S3Transfer abstraction模块->;它为高效的上传/下载提供了高级抽象。用法示例:

client = boto3.client('s3', 'us-west-2')
transfer = S3Transfer(client)

transfer.download_file('bucket', 'key', '/tmp/myfile')

如果您想使用boto3将大量较小的文件直接并行下载到磁盘上,可以使用multiprocessing模块来完成。这里有一个小片段可以做到这一点。你可以这样运行它:./download.py bucket_name s3_key_0 s3_key_1 ... s3_key_n

#!/usr/bin/env python3
import multiprocessing
import boto3
import sys

# make a per process s3_client
s3_client = None
def initialize():
  global s3_client
  s3_client = boto3.client('s3')

# the work function of each process which will fetch something from s3
def download(job):
  bucket, key, filename = job
  s3_client.download_file(bucket, key, filename)

if __name__ == '__main__':
  # make the jobs, arguments to program are: bucket s3_key_0 s3_key_1 ... s3_key_n
  bucket = sys.argv[1]
  jobs = [(bucket, key, key.replace('/', '_')) for key in sys.argv[2:] ]

  # make a process pool to do the work
  pool = multiprocessing.Pool(multiprocessing.cpu_count(), initialize)
  pool.map(download, jobs)
  pool.close()
  pool.join()

其中一个重要的部分是,我们为每个进程将重用的每个进程创建一个s3客户机实例。这一点很重要,有两个原因。首先,创建客户机是缓慢的,所以我们希望尽可能少地这样做。其次,不应在进程之间共享客户端,因为对download_file的调用可能会改变客户端的内部状态。在

相关问题 更多 >

    热门问题