当Jupyter笔记本中的多处理.Process调用时,目标函数不会分配给类属性

时间:2017-12-01 10:35:06

标签: python python-3.x class multiprocessing

请考虑以下代码:

class Test:
    def __init__(self):
        self.out = []

    def fit(self, x):
        for i in x:
            self.out.append(i*i)

test = Test()
X = [1, 2, 3, 4, 5]

我在Jupyter笔记本中使用test.fit()格式Process致电multiprocessing,如下所示:

from multiprocessing import Process

p = Process(target=test.fit, args=(X,))
p.start()

我的问题是,即使Process调用test.fit,产品i*i也不会附加到test.out。如果我将self.out.append(i*i)替换为print(i*i),我会得到所需的结果。因此,计算完成。如果我在没有test.fit(X)的情况下致电Process,则test.out会根据需要追加。我在这里做错了什么?

在macOS 10.12上使用Jupyter 4.4.0

1 个答案:

答案 0 :(得分:0)

由于GIL,Python基本上不能与子进程共享内存。为了与子进程共享内存,我认为你需要使用multiprocessing.Queue

from multiprocessing import Process, Queue

class Test:
    def __init__(self):
        self.out = Queue()

    def fit(self, x):
        for i in x:
            self.out.put(i*i)

test = Test()
X = [1, 2, 3, 4, 5]

p = Process(target=test.fit, args=(X,))
p.start()
p.join()

然后,从队列中获取值。

y = []
while not test.out.empty():
    y.append(test.out.get())
print(y)

加@十二分之二千零一十七/版本02

通过shared list创建multiprocessing.Manager的另一种方法是在这里。我想这就是你最初的尝试。

from multiprocessing import Manager, Process, Queue

manager = Manager()

class Test:
    def __init__(self):
        self.out = shared_list = manager.list()

    def fit(self, x):
        for i in x:
            self.out.append(i*i)

test = Test()
X = [1, 2, 3, 4, 5]

p = Process(target=test.fit, args=(X,))
p.start()
p.join()

print(test.out)