使用BaseManager()实现多进程之间的安全通信
发布时间:2024-01-14 21:43:17
在Python中,可以使用multiprocessing模块来实现多进程之间的通信。其中,BaseManager是一个基类,可以用于创建可以在多个进程之间共享的管理器对象。
以下是使用BaseManager实现多进程之间的安全通信的示例:
from multiprocessing import Process
from multiprocessing.managers import BaseManager
# 定义一个共享的数据类型
class SharedData:
def __init__(self):
self.data = []
# 创建一个派生自BaseManager的Manager类
class MyManager(BaseManager):
pass
# 注册共享数据类型
MyManager.register('SharedData', SharedData)
# 子进程中的函数,用于修改共享数据
def modify_data():
# 连接到共享数据的Manager对象
manager = MyManager(address=('localhost', 50000), authkey=b'abc')
manager.connect()
# 获取共享数据对象
shared_data = manager.SharedData()
# 修改共享数据
shared_data.data.append('data modified by child process')
# 打印共享数据
print('Child process shared data:', shared_data.data)
# 主进程中的函数,用于读取共享数据
def read_data():
# 创建一个共享数据的Manager对象
manager = MyManager(address=('localhost', 50000), authkey=b'abc')
manager.start()
# 获取共享数据对象
shared_data = manager.SharedData()
# 打印共享数据
print('Parent process shared data:', shared_data.data)
if __name__ == '__main__':
# 创建一个子进程,用于修改共享数据
p = Process(target=modify_data)
p.start()
p.join()
# 主进程读取共享数据
read_data()
在上面的示例中,首先我们定义了一个SharedData类,它包含一个data属性,表示共享的数据。然后,我们创建一个派生自BaseManager的MyManager类,并注册了SharedData类型。
在子进程中,我们通过manager.connect()连接到共享数据的Manager对象,并获取到共享数据对象shared_data。然后,我们对共享数据进行修改,并打印修改后的数据。
在主进程中,我们通过manager.start()创建一个共享数据的Manager对象,并获取到共享数据对象shared_data。然后,我们打印共享数据。
最后,我们创建一个子进程,用于修改共享数据,然后等待子进程结束后,主进程读取并打印共享数据。
需要注意的是,连接和启动共享数据的Manager对象时,需要指定address和authkey。address表示连接的地址,authkey表示连接的认证密钥,确保只有具有相同认证密钥的进程才能连接到共享数据对象。
总结起来,使用BaseManager可以方便地实现多进程之间的安全通信。通过注册共享数据类型,我们可以在不同进程之间共享数据,并使用共享数据的Manager对象进行连接、启动和获取共享数据。
