欢迎访问宙启技术站
智能推送

使用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属性,表示共享的数据。然后,我们创建一个派生自BaseManagerMyManager类,并注册了SharedData类型。

在子进程中,我们通过manager.connect()连接到共享数据的Manager对象,并获取到共享数据对象shared_data。然后,我们对共享数据进行修改,并打印修改后的数据。

在主进程中,我们通过manager.start()创建一个共享数据的Manager对象,并获取到共享数据对象shared_data。然后,我们打印共享数据。

最后,我们创建一个子进程,用于修改共享数据,然后等待子进程结束后,主进程读取并打印共享数据。

需要注意的是,连接和启动共享数据的Manager对象时,需要指定addressauthkeyaddress表示连接的地址,authkey表示连接的认证密钥,确保只有具有相同认证密钥的进程才能连接到共享数据对象。

总结起来,使用BaseManager可以方便地实现多进程之间的安全通信。通过注册共享数据类型,我们可以在不同进程之间共享数据,并使用共享数据的Manager对象进行连接、启动和获取共享数据。