如何在多个线程之间共享资源?

时间:2020-02-27 09:52:59

标签: python parallel-processing boto3

我正在编写一个脚本,该脚本应该并行地从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

感谢您的帮助。

0 个答案:

没有答案