Python ProcessPoolExecutor:返回的对象中丢失了成员变量

Python ProcessPoolExecutor:返回的对象中丢失了成员变量,python,parallel-processing,multiprocessing,future,python-multiprocessing,Python,Parallel Processing,Multiprocessing,Future,Python Multiprocessing,我有一个这样的类,它基于defaultdict,它还有一个成员变量是defaultdict(我猜这就是问题所在?) 我正在使用concurrent.futures创建A的不同实例,如下所示: from concurrent.futures import ProcessPoolExecutor, as_completed futures = [] num_processes = 2 #some integer value def process_parallel(id): A_1 = A(

我有一个这样的类,它基于
defaultdict
,它还有一个成员变量是defaultdict(我猜这就是问题所在?)

我正在使用
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用于序列化和反序列化您的类实例,并且作为实例的“B”属性的defaultdict的内容没有保留

您可以通过在解释器中创建和更新类的实例、对它们进行pickle和unpickle并检查结果来验证这一点

如果您创建一个容器类来保存这两个defaultdict,那么它们都能经受酸洗并保持其内容完整,因此这可能是最好的方法。例如(假设蟒蛇3):

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
class A:

    def __init__(self):
        self.foo = defaultdict(int)
        self.bar = defaultdict(int)

    def baz(self, value):
        # update defaultdicts