一、数据共享简介
multiprocessing.Manager 是 Python 的 multiprocessing 模块中的一个类,它提供了一种方便的方法来创建共享对象,这些共享对象可以被多个进程安全地访问和修改。使用 Manager 可以解决多进程并发访问共享资源时的同步问题。
二、常用方法
1、创建共享对象:
使用 Manager 的 dict()、list()、Value()、Array() 等方法可以创建共享的字典、列表、值和数组等对象。
这些共享对象由 Manager 进程管理,可以在多个进程之间安全地共享和操作。
2、安全的进程间通信:
Manager 内部使用进程间通信(IPC)机制来确保共享对象的同步和一致性。
这意味着在多进程环境中,多个进程可以同时访问和修改共享对象,而不会出现数据损坏或其他问题。
3、支持多种数据类型:
Manager 提供了对多种常见数据类型的支持,包括字典、列表、值和数组等。
可以根据需要选择适合的共享对象类型来共享数据。
4、方便的使用方法:
使用 Manager 创建共享对象非常简单,只需调用 Manager 的相应方法即可创建所需类型的共享对象。
共享对象的创建和管理都由 Manager 处理,无需手动处理进程间通信等细节。
5、上下文管理器:
Manager 可以作为上下文管理器使用,以确保在使用完共享对象后正确关闭和释放资源。
使用 with 语句可以方便地管理共享对象的生命周期。
三、直接进程传参的区别
使用 multiprocessing.Manager 和直接传递普通字典变量之间的主要区别在于并发访问的安全性和数据同步。
使用 multiprocessing.Manager:
multiprocessing.Manager 提供了一种线程安全的方式来创建共享对象,如字典、列表等。
这些共享对象由 Manager 管理,可以被多个进程安全地访问和修改。
在内部,Manager 使用了进程间通信(IPC)来确保数据同步和一致性,因此可以保证并发访问时不会出现数据损坏或其他问题。
直接传递普通字典变量:
如果直接传递普通的字典变量给多个进程,每个进程将拥有自己的独立副本。
这意味着每个进程操作的都是自己的字典副本,而不是同一个共享的字典对象。
在多进程环境中,由于进程之间内存空间是独立的,因此普通字典变量的修改不会反映到其他进程的字典中。
总之,使用 multiprocessing.Manager 创建共享对象可以确保多个进程之间安全地共享和操作数据,而直接传递普通字典变量则会导致每个进程操作自己的独立副本,无法实现真正的共享。
四、案例
from multiprocessing import Process, Managerdef process_func1(shared_dict):shared_dict['key1'] = 'value1'shared_dict['key2'] = 'value2'def process_func2(shared_dict):shared_dict['key3'] = 'value3'if 'key1' in shared_dict:del shared_dict['key1']if __name__ == '__main__':with Manager() as manager:shared_dict = manager.dict()process1 = Process(target=process_func1, args=(shared_dict,))process2 = Process(target=process_func2, args=(shared_dict,))process1.start()process2.start()process1.join()process2.join()print("Final shared dictionary:", shared_dict)#################################################################
Final shared dictionary: {'key2': 'value2', 'key3': 'value3'}
#################################################################
五、总结
1、创建进程时的普通传参,值发生变化后,其他进程中的变量值并不会改变
2、使用Manager创建变量传参,值发生变化后,其他进程中的值也会发生变化。