Python中多进程间通信(multiprocessing.Manager)

Python中写多进程的程序,一般都使用multiprocesing模块。进程间通讯有多种方式,包括信号,管道,消息队列,信号量,共享内存,socket等。这里主要介绍使用multiprocessing.Manager模块实现进程间共享数据。


Python中进程间共享数据,处理基本的queue,pipe和value+array外,还提供了更高层次的封装。使用multiprocessing.Manager可以简单地使用这些高级接口。

Manager()返回的manager对象控制了一个server进程,此进程包含的python对象可以被其他的进程通过proxies来访问。从而达到多进程间数据通信且安全。

Manager支持的类型有list,dict,Namespace,Lock,RLock,Semaphore,BoundedSemaphore,Condition,Event,Queue,Value和Array。

Manager的dict,list使用
import multiprocessing
import time

def worker(d, key, value):
    d[key] = value
 
if __name__ == '__main__':
    mgr = multiprocessing.Manager()
    d = mgr.dict()
    jobs = [ multiprocessing.Process(target=worker, args
### 如何使用 Python `multiprocessing.Manager` 模块 #### 创建 Manager 实例并共享列表 为了实现多个进程之间的数据共享,可以通过创建一个 `Manager()` 的实例来获取管理器对象。这个管理器能够提供多种可共享的数据结构,比如列表、字典等。 ```python from multiprocessing import Process, Manager def add_items_to_list(lst): lst.append('item') print(f'List after adding item: {lst}') if __name__ == '__main__': with Manager() as manager: shared_list = manager.list() process = Process(target=add_items_to_list, args=(shared_list,)) process.start() process.join() print(f'Shared list in main process: {list(shared_list)}') ``` 这段代码展示了如何利用 `Manager().list()` 方法创建可以在不同进程中修改的共享列表[^1]。 #### 使用命名空间 (Namespace) 除了基本的数据容器外,还可以借助 `Manager().Namespace()` 来定义更复杂的共享状态: ```python from multiprocessing import Process, Manager def update_namespace(ns): ns.count += 1 print(f'Updated count to {ns.count} inside child process') if __name__ == '__main__': with Manager() as manager: namespace = manager.Namespace() setattr(namespace, 'count', 0) processes = [] for _ in range(3): p = Process(target=update_namespace, args=(namespace,)) p.start() processes.append(p) for p in processes: p.join() print(f'Final value of count is {namespace.count}') ``` 这里说明了怎样通过设置属性的方式向命名空间添加变量,并让它们在各个子进程中保持同步更新[^2]。 #### 锁机制防止竞态条件 当涉及到并发操作时,为了避免可能发生的竞争状况,应该引入锁来进行保护。下面的例子显示了如何结合 `Lock` 和 `Manager` 来确保线程安全的操作: ```python import time from multiprocessing import Process, Manager def safe_increment(counter, lock): with lock: current_value = counter.value time.sleep(0.1) # Simulate some processing delay counter.value = current_value + 1 print(f'Counter incremented safely by a worker.') if __name__ == '__main__': with Manager() as manager: counter = manager.Value('i', 0) lock = manager.Lock() workers = [Process(target=safe_increment, args=(counter, lock)) for i in range(5)] for w in workers: w.start() for w in workers: w.join() print(f'The final counter value should be 5 and it is actually {counter.value}.') ``` 上述程序片段解释了如何运用 `Manager().Value()` 和 `Manager().Lock()` 来维护计数器的安全递增过程[^4].
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值