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

使用Python中的multiprocessing.managersBaseManager()实现进程间通信

发布时间:2023-12-24 07:34:30

在Python中,使用multiprocessing模块的BaseManager类可以实现进程间通信。BaseManager是一个辅助类,用于管理维护共享对象,并提供访问这些对象的接口。它提供了一种简单的方式,允许多个进程在共享状态下访问或修改对象。

下面是一个简单的例子,演示如何使用multiprocessing.BaseManager来实现对共享数据的访问和修改。

from multiprocessing.managers import BaseManager
import random

# 定义共享的数据结构
class SharedData(object):
    def __init__(self):
        self.data = []

    def add_data(self, value):
        self.data.append(value)

    def get_data(self):
        return self.data


# 创建一个派生自BaseManager的RemoteManager类
class RemoteManager(BaseManager):
    pass


# 注册共享数据结构
RemoteManager.register('SharedData', SharedData)


def worker_process():
    # 生成一个随机数,并将其添加到共享数据中
    value = random.randint(1, 100)
    shared_data = manager.SharedData()
    shared_data.add_data(value)


if __name__ == '__main__':
    # 创建一个共享数据的管理器
    manager = RemoteManager()
    manager.start()

    # 创建多个进程来访问共享数据
    processes = []
    for _ in range(5):
        process = multiprocessing.Process(target=worker_process)
        process.start()
        processes.append(process)

    # 等待所有进程结束
    for process in processes:
        process.join()

    # 通过管理器访问共享数据
    shared_data = manager.SharedData()
    data = shared_data.get_data()
    print(f"共享数据: {data}")

在上面的例子中,我们首先定义了一个SharedData类,它包含一个data属性,用于存储共享数据。SharedData还提供了两个方法:add_data()用于添加数据,get_data()用于获取数据。

接下来,我们创建了一个派生自BaseManagerRemoteManager类,并通过调用RemoteManager.register()方法注册了SharedData类。

worker_process()函数中,我们生成一个随机数,并通过共享数据的管理器访问和修改共享数据。

然后,我们在__main__函数中创建了一个共享数据的管理器manager,并通过manager.start()方法启动它。

接着,我们创建了多个进程来访问共享数据,并将这些进程添加到processes列表中。在每个进程中,我们通过manager.SharedData()来获取共享数据对象,并调用add_data()方法将随机数添加到共享数据中。

最后,我们通过manager.SharedData()再次获取共享数据对象,并调用get_data()方法获取共享数据。输出结果将打印出添加到共享数据中的随机数列表。

在使用multiprocessing模块时,请注意if __name__ == '__main__':这一行代码。这是为了确保进程间通信工作正常。