使用地图,池和管理器

时间:2019-04-02 10:26:26

标签: python python-3.x multiprocessing

我有一个list,其中包含tuples作为元素。列表如下所示: elements = [('a', 'b'), ('c', 'd'), ...]

此列表上有一些我想做的操作。但是此列表中的元素数量很大。因此,我想进行多处理。同样,最终结果应存储在另一个列表中。但是我无法弄清楚如何传递参数。这是我的示例代码:

class DoSomething:
    def __init__(self):
        pass
    def __call__(self, pair, final_list):
        y = " ".join(pair)
        if y in ["a b c", " b c", "a c"]:
            final_list+=y

pairs = [('a', 'b'), ('a', 'c'), ('b', 'c'), ('b', 'd')]
ds = DoSomething()
p =  Pool()

with Manager() as manager:
    final_list = manager.list()
    p.map(ds(..)) # I don't know how to call this now

如何立即将final_list传递给ds

1 个答案:

答案 0 :(得分:0)

我认为您不需要将final_list传递给可调用对象,只需在类中声明final_list,甚至在__init__内声明更好。

from multiprocessing import Pool, Manager


class DoSomething:
    m = Manager()
    final_list = m.list()
    def __init__(self):
    # m = Manager()
    # self.final_list = m.list()
        pass
    def __call__(self, pair):
        y = " ".join(pair)
        if y not in ["a b c", " b c", "a c"]:
            self.final_list.append(y)

pairs = [('a', 'b'), ('a', 'c'), ('b', 'c'), ('b', 'd')]
ds = DoSomething()
p =  Pool()

p.map(ds, pairs)

print(ds.final_list)

或者您也可以使用starmap来传递多个参数,如下所示

l = list(zip_longest(l, pairs))
p.starmap(ds, l)