蟒 - Mutliprocess,类成员函数(Python - Mutliprocess, mem

2019-10-16 22:33发布

我想不通这是不是因为我,或者说Python2.7具有多模块。 谁能弄清楚这是为什么不工作?

from multiprocessing import pool as mp
class encapsulation:
   def __init__(self):
       self.member_dict = {}
   def update_dict(self,index,value):
       self.member_dict[index] = value
encaps = encapsulation()
def method(argument):
   encaps.update_dict(argument,argument)
   print encaps.member_dict
p = mp() #sets up multiprocess pool of processors
p.map(method,sys.argv[1:]) #method is the function, sys.argv is the list of arguments to multiprocess
print encaps.member_dict
>>>{argument:argument}
>>>{}

所以我的问题是差不多的成员变量。 这是我的理解是,类的封装应持有内外功能的这本字典。 为什么它复位,并给我,即使我只有一次初始化一个空的字典? 请帮忙

Answer 1:

即使要封装的对象时,多模块最终会使用对象的本地副本中的每一个过程,从来没有真正传播的更改保存到你。 在这种情况下,你是不是使用Pool.map正确的,因为它需要每个方法调用返回的结果,然后将其发送备份到您的返回值。 如果你想要的是影响到共享对象,那么你需要一个经理,这将协调共享内存:

封装共享对象

from multiprocessing import Pool 
from multiprocessing import Manager
import sys

class encapsulation:
   def __init__(self):
       self.member_dict = {}
   def update_dict(self,index,value):
       self.member_dict[index] = value

encaps = encapsulation()

def method(argument):
   encaps.update_dict(argument,argument)
   # print encaps.member_dict       

manager = Manager()
encaps.member_dict = manager.dict()

p = Pool()
p.map(method,sys.argv[1:])

print encaps.member_dict

产量

$ python mp.py a b c
{'a': 'a', 'c': 'c', 'b': 'b'}

我建议没有真正设定共享对象的成员属性,而是传递为精氨酸,或封装共享对象本身,然后通过自己的价值观到您的字典。 共享对象不能持续保持。 它需要清空和丢弃:

# copy the values to a reg dict
encaps.member_dict = encaps.member_dict.copy()

但是,这甚至可能会更好:

class encapsulation:
   def __init__(self):
       self.member_dict = {}
   # normal dict update
   def update_dict(self,d):
       self.member_dict.update(d)

encaps = encapsulation()

manager = Manager()
results_dict = manager.dict()

# pass in the shared object only
def method(argument):
   results_dict[argument] = argument    

p = Pool()
p.map(method,sys.argv[1:])

encaps.update_dict(results_dict)

使用pool.map如预期

如果您在使用地图返回值,它可能是这样的:

def method(argument):
   encaps.update_dict(argument,argument)
   return encaps.member_dict

p = Pool()
results = p.map(method,sys.argv[1:]) 
print results
# [{'a': 'a'}, {'b': 'b'}, {'c': 'c'}]

您将需要的结果到您的字典再次结合:

for result in results:
    encaps.member_dict.update(result)
print encaps.member_dict
# {'a': 'a', 'c': 'c', 'b': 'b'}


文章来源: Python - Mutliprocess, member functions of classes