使用pp模块时,对象'test'中的dict'params'无法更新。谁能告诉我为什么会这样呢?看看代码:
import pp
class test(object):
params = {'n': None}
dic2 = {}
n = None
def __init__(self, i):
#won't change
self.params['n'] = i
#changed
self.n = i
self.dic2 = {i: i}
def run(self):
print self.n, self.params, self.dic2
job_server = pp.Server()
jobs = []
for i in xrange(10):
t = test(i)
#won't change
t.params['n'] = i
#changed
t.n = i
t.run()
jobs.append(job_server.submit(t.run))
[job() for job in jobs]
结果:
0 {'n': 0} {0: 0}
1 {'n': 1} {1: 1}
2 {'n': 2} {2: 2}
3 {'n': 3} {3: 3}
4 {'n': 4} {4: 4}
0 {'n': None} {0: 0}
1 {'n': None} {1: 1}
2 {'n': None} {2: 2}
3 {'n': None} {3: 3}
4 {'n': None} {4: 4}
正如我们在使用pp时所看到的那样,“params ['n']”无法更新。这是一种奇怪的行为。怎么会发生这种情况?
答案 0 :(得分:3)
这是多处理模块的常见缺陷。
当您执行job_server.submit(t.run)
之类的调用时,对象t
被腌制,被发送到新进程,未被修改,run
被执行并且返回值被腌制,被发送回主要过程和未完成的。
现在,实际上并不支持类酸洗(参见here)。 pickle只是腌制名称,当取消它时,重新导入模块以获得类对象。
由于您使用的变量是类变量,因此在重新导入模块时会重新初始化它们。函数的属性也会发生同样的情况。
如果要保留这些变量的值,必须使它们成为实例变量。