请考虑以下代码:
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
答案 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)