我有一个基于defaultdict
的类,它也有一个成员变量,它是一个defaultdict(我的猜测:这是问题所在吗?):
from collections import defaultdict
class A(defaultdict):
def __init__(self):
super(A, self).__init__(int)
self.B = defaultdict(int)
def methodA(self, id):
# update values in self.B and self[key], for example:
# self[id] = 1000
# self[1] = 1
# self.B[id] = 2000
# self.B[2] = 2
def get_B(self):
return self.B.iteritems()
def get_dict(self):
return self.iteritems()
我正在使用
concurrent.futures
来创建A
的不同实例,如下所示:from concurrent.futures import ProcessPoolExecutor, as_completed
futures = []
num_processes = 2 #some integer value
def process_parallel(id):
A_1 = A()
A_1.methodA(id)
return A_1
with ProcessPoolExecutor() as exec:
for p in range(num_processes):
futures.append(exec.submit(process_parallel, p))
for f in as_completed(futures):
A_instance = f.result()
# iterate over A_instance.get_dict() and A_instance.get_B
# A_instance[1] can be accessed, but A_instance.B is empty
问题是在期货完成并返回其结果之后,
B
成员变量不包含任何内容。为了进行检查,我确保B
是非空的,甚至可以在methodA
的末尾打印其元素,但是一旦回到主过程中,突然似乎B
就消失了。是否应单独初始化
B
?什么是正确的方法? 最佳答案
我认为这里发生的事情是ProcessPoolExecutor正在使用pickle来序列化和反序列化您的类实例,而作为实例的'B'属性的defaultdict的内容未保留。
您可以通过在解释器中创建和更新类的实例,对它们进行酸洗和酸洗以及检查结果来验证这一点。
如果创建一个容器类来容纳这两个默认字典,它们都将在腌制过程中幸免于难,并且它们的内容完好无损,因此这可能是最好的方法。例如(假设python3):
class A:
def __init__(self):
self.foo = defaultdict(int)
self.bar = defaultdict(int)
def baz(self, value):
# update defaultdicts
关于python - ProcessPoolExecutor:成员变量在返回的对象中丢失,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35918500/