我正在编写一个脚本,该脚本应该并行地从S3存储中检索文件数据。我无法使用来自多处理模块的简单Pool对象来执行此操作,因为这样我会得到boto3的错误。资源对象不能被腌制。
我明白了为什么,我实现了一个使用池的解决方案,但是目标函数不使用共享资源,而是在每个线程内创建新资源。但是我发现这种方法的效率极低,甚至连顺序处理都更快。
我知道Pool可以选择设置使用的工作程序数量,但是有什么方法可以创建Resource的多个实例并将它们“分配”给这些工作程序,因此我不必为它创建新的实例。每个要处理的物品?
代码:
class Client:
def __init__(self, url, access_key, secret_key):
self.url = url
self.access_key = access_key
self.secret_key = secret_key
def get_resource(self):
return boto3.resource('s3',
endpoint_url=self.url,
aws_access_key_id=self.access_key,
aws_secret_access_key=self.secret_key)
def get_data_for_object(self, key):
data = []
resource = self.get_resource()
for line in resource.Object(bucket_name='bucket_name', key=key).get()['Body'].iter_lines():
data.append(json.loads(line))
return data
def get_data_for_minute(self, minute):
keys = [...] # object keys in S3 storage
pool = Pool()
data = pool.imap(self.get_data_for_object, keys)
flat_data = list(itertools.chain.from_iterable(data))
return flat_data
感谢您的帮助。