python 共享内存manager_multiprocessing.Manager共享内存的问题记录

使用 multiprocessing.Manager 来实现IPC的时候,遇到的问题

示例1

>>> from multiprocessing import Process, Manager

>>>

>>> manager = Manager()

>>> d = manager.dict()

>>>

>>> def f():

... d['k'].append(3)

... print d

...

>>> if __name__ == '__main__':

... d['k'] = []

... p = Process(target=f)

... p.start()

... p.join()

...

{'k': []}

>>>

示例2

>>> from multiprocessing import Process, Manager

>>>

>>> def f(d):

... d['k'].append(4)

... print type(d),d,id(d)

...

>>> if __name__ == '__main__':

... manager = Manager()

... d = manager.dict({'k':[]})

... p = Process(target=f,args=(d,))

... p.start()

... p.join()

... print type(d),d,id(d)

...

{'k': []} 140607041173456

{'k': []} 140607041173456

>>>

为什么没有append成功呢?

再看示例3

>>> from multiprocessing import Process, Manager

>>>

>>> manager = Manager()

>>> d = manager.dict()

>>>

>>> def f():

... d['k'] = 2

... print d

...

>>> if __name__ == '__main__':

... d['k'] = []

... p = Process(target=f)

... p.start()

... p.join()

...

{'k': 2}

>>>

总结

使用Manager方法时需要注意,在操作共享对象时候,除了赋值操作,其他的方法都作用在共享对象的拷贝上,并不会对共享对象生效。

以下是一个示例代码,展示如何在类中使用`multiprocessing.apply_async`和`multiprocessing.Manager`: ```python import multiprocessing class MyManager(object): def __init__(self): self.manager = multiprocessing.Manager() self.my_list = self.manager.list() def add_item(self, item): self.my_list.append(item) def process_item(self, item): # Do some processing on the item return processed_item def process_items(self): with multiprocessing.Pool() as pool: for item in self.my_list: pool.apply_async(self.process_item, args=(item,), callback=self.add_item) # Wait for all processes to finish pool.close() pool.join() if __name__ == '__main__': manager = MyManager() manager.add_item('item1') manager.add_item('item2') manager.process_items() print(manager.my_list) ``` 在这个示例中,我们首先创建了一个`MyManager`类,并在类的构造函数中初始化了一个`multiprocessing.Manager`对象和一个共享列表`my_list`。然后,我们定义了一个`add_item`方法,用于向共享列表中添加新的项目。 接下来,我们定义了`process_item`方法,该方法对每个项目进行处理,并返回处理后的结果。 最后,我们定义了`process_items`方法,该方法使用`multiprocessing.Pool`创建一个进程池,并使用`apply_async`方法异步处理每个项目。我们还将`add_item`方法作为回调函数传递给`apply_async`,以便在处理完成后将结果添加到共享列表中。 在主函数中,我们创建了一个`MyManager`对象,并向其中添加了两个项目。然后,我们调用了`process_items`方法来处理这些项目,并在处理完成后打印了共享列表中的所有项目。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值