多进程共享内存中的对象?

时间:2015-02-03 15:58:44

标签: python multiprocessing

我有一组对象状态比我认为以1:1为基础进行线程或处理是合理的,让我们说它看起来像这样

class SubState(object):
    def __init__(self): 
        self.stat_1 = None
        self.stat_2 = None
        self.list_1 = []

class State(object): 
    def __init__(self): 
        self.my_sub_states = {'a': SubState(), 'b': SubState(), 'c': SubState()}

我想要做的是让每个sub_statesself.my_sub_states密钥共享,并通过抓取整个子状态的单个锁来访问它们 - 即{{ 1}}等等,然后在我完成后释放它。是否有一个类我可以继承以使用单个Lock共享整个SubState对象?

实际进程工作者将从self.locks={'a': multiprocessing.Lock(), 'b': multiprocessing.Lock()中提取任务(我无法将sub_states作为args传递给进程,因为他们在获得下一个任务之前不知道他们需要哪个sub_state)。


编辑:我也不想使用经理 - 经理人的表现非常缓慢(我没有做过基准测试,但是我倾向于认为内存数据库的工作速度比管理员更快,如果它归结为它)。

1 个答案:

答案 0 :(得分:1)

作为multiprocessing docs state,您实际上只有两个选项可以在multiprocessing.Process个实例之间实际共享状态(至少不需要第三方选项 - 例如redis):

  1. 使用Manager
  2. 使用multiprocessing.sharedctypes
  3. Manager将允许您共享纯Python对象,但正如您所指出的,对这种共享对象的读写访问速度非常慢。

    multiprocessing.sharedctypes将使用实际共享内存,但您仅限于共享ctypes个对象。因此,您需要将SubState对象转换为ctypes.Struct。另外值得注意的是,每个multiprocessing.sharedctypes对象都有自己的内置锁,因此您可以通过在操作之前显式获取该锁来同步对每个对象的访问。