#!/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()
添加到上面的注释中,您应该使用S3Transfer abstraction模块->;它为高效的上传/下载提供了高级抽象。用法示例:
如果您想使用
boto3
将大量较小的文件直接并行下载到磁盘上,可以使用multiprocessing
模块来完成。这里有一个小片段可以做到这一点。你可以这样运行它:./download.py bucket_name s3_key_0 s3_key_1 ... s3_key_n
其中一个重要的部分是,我们为每个进程将重用的每个进程创建一个s3客户机实例。这一点很重要,有两个原因。首先,创建客户机是缓慢的,所以我们希望尽可能少地这样做。其次,不应在进程之间共享客户端,因为对
download_file
的调用可能会改变客户端的内部状态。在相关问题 更多 >
编程相关推荐