多处理池卡住

时间:2020-05-15 13:35:13

标签: python multiprocessing

我在多处理方面经验不足,但到目前为止,它似乎一直讨厌我。 我正在尝试运行最简单的示例,但是它陷入了困境,必须重新启动内核。

我的例子:

import multiprocessing as mp

aa = [x for x in range(3,16)]

def f(x):
    return x**2

if __name__ == '__main__':
    with mp.Pool(processes = 4) as p:
        res = p.map(f, aa)

print(res)

在我尝试使用类方法并在pool.map()内部进行归类之前,它一直工作得很好。 我认为在尝试执行此操作后它就坏了:

class clasy():
    def __init__(self, a, b):
        self.a = a
        self.b = b

    def gen(self):
        for i in range(self.a, self.b):
            yield i

    def dodo(self):
        gg = gen()
        with mp.Pool() as pool:
            self.res = pool.map(f, gg)
        return self.res

paralel = clasy(3,16)
print(paralel.dodo())

出了什么问题,可以解决吗?

此外,是否可以在pool.map()内部使用生成器的类方法,是否可以在类内部使用。或者池,函数和迭代器应该是顶级对象?

1 个答案:

答案 0 :(得分:0)

您需要将函数f传递给类clasy或使其成为类的实例。例如,以下应该起作用:

class clasy():
    def __init__(self, a, b):
        self.a = a
        self.b = b

    def gen(self):
        for i in range(self.a, self.b):
            yield i

    def f(self, x):
        return x**2

    def dodo(self):
        gg = self.gen()
        with mp.Pool(processes = 4) as pool:
            self.res = pool.map(self.f, gg)
        return self.res

paralel = clasy(3,16)
print(paralel.dodo())

Out[1]:
[9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225]