【多进程】multiprocessing.Manager

multiprocessing.Manager() 是 Python multiprocessing 模块中的一个功能,它提供了一个服务器进程,该进程可以创建和管理跨多个Python进程共享的对象。这个管理器使得你可以创建像列表(list)、字典(dict)、锁(Lock)、事件(Event)等可以被多个进程安全访问和修改的对象。

使用场景

  • 共享数据:当你需要在多个进程之间共享数据时,可以使用 multiprocessing.Manager() 来创建这些共享数据结构。
  • 进程间同步:管理器还提供了锁(Lock)和事件(Event)等同步机制,使得进程间可以协调操作,避免数据竞争等问题。

主要特点

  • 服务器进程:当你调用 multiprocessing.Manager() 时,Python 会启动一个服务器进程(通常在后台运行),这个进程负责创建和管理那些可以在多个进程间共享的对象。
  • 跨进程访问:通过管理器创建的对象(如列表、字典等)可以在不同的进程中被访问和修改,且这些修改会实时反映在所有访问这些对象的进程中。
  • 线程安全:管理器提供的数据结构通常是线程安全的,这意味着它们可以在多线程环境中安全使用,虽然 multiprocessing 模块主要用于多进程环境。

示例代码

下面是一个简单的示例,展示了如何使用 multiprocessing.Manager() 来创建共享列表,并在多个进程中修改它:

复制代码
 1 import multiprocessing
 2 
 3 def worker(shared_list, index, value):
 4     # 访问并修改共享列表
 5     shared_list[index] = value
 6     print(f'Process {multiprocessing.current_process().name} updated index {index} to {value}')
 7 
 8 if __name__ == '__main__':
 9     with multiprocessing.Manager() as manager:
10         # 创建一个可以在进程间共享的列表
11         shared_list = manager.list([0] * 10)
12 
13         processes = []
14         for i in range(10):
15             p = multiprocessing.Process(target=worker, args=(shared_list, i, i*10))
16             processes.append(p)
17             p.start()
18 
19         for p in processes:
20             p.join()
21 
22         # 打印最终共享列表的内容
23         print('Final shared list:', shared_list)
复制代码

在这个例子中,我们创建了一个包含10个元素的共享列表,然后启动了10个进程,每个进程都会更新列表中的一个元素。由于列表是共享的,所以所有进程看到的都是同一个列表的修改结果。

注意事项

  • 性能:虽然 multiprocessing.Manager() 提供了进程间共享数据的便利,但它也有一些性能开销,特别是在涉及大量数据交换或频繁修改时。
  • 使用限制:不是所有类型的对象都可以通过管理器来共享。例如,自定义的类实例通常不能直接通过管理器共享,除非它们遵循特定的规则(如实现了特定的序列化方法)。

通过 multiprocessing.Manager(),Python 提供了一种方便且相对安全的方式来实现进程间的数据共享和同步,使得开发者可以在多进程编程中更加灵活地处理数据和协调进程。

posted on   张凌赫_帅  阅读(218)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示