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

使用Python的SyncManager()实现进程间资源的共享和同步

发布时间:2024-01-06 18:35:00

在Python中,可以使用SyncManager类实现进程间资源的共享和同步。SyncManager类是multiprocessing模块中的一个子类,它提供了一些方便的方法来创建和管理共享的对象。

使用SyncManager时,需要创建一个被管理的服务器进程,然后在其他进程中使用代理对象来访问共享资源。下面是一个使用SyncManager实现进程间资源共享和同步的例子,通过一个简单的计数器来说明:

import multiprocessing as mp

# 创建共享对象的类
class SharedCounter(object):
    def __init__(self, initial_value=0):
        self._value = mp.Value('i', initial_value)

    def increment(self, num=1):
        with self._value.get_lock():
            self._value.value += num

    def value(self):
        with self._value.get_lock():
            return self._value.value

# 启动服务器进程来管理共享对象
def manager_task(counter):
    mp.current_process().authkey = b'secret_key'  # 设置认证密钥
    server = mp.SyncManager(address=('localhost', 5000), authkey=b'secret_key')
    server.start()
    server.register('counter', counter)

    input("Press Enter to exit...")
    server.shutdown()

# 使用代理对象访问共享对象
def worker_task():
    client = mp.SyncManager(address=('localhost', 5000), authkey=b'secret_key')
    client.connect()
    counter = client.counter

    for i in range(10):
        counter.increment()
        print(f"Worker: counter value = {counter.value()}")
        mp.sleep(1)

if __name__ == '__main__':
    counter = SharedCounter()
    
    # 启动服务器进程
    manager_process = mp.Process(target=manager_task, args=(counter,))
    manager_process.start()

    # 启动多个工作进程
    worker_processes = [mp.Process(target=worker_task) for _ in range(2)]
    for p in worker_processes:
        p.start()

    # 等待工作进程结束
    for p in worker_processes:
        p.join()

    manager_process.join()

在这个例子中,我们创建了一个共享的计数器对象SharedCounter,它使用multiprocessing模块的Value来共享一个整数值。我们通过SyncManager将这个SharedCounter对象注册到服务器进程中,然后在工作进程中使用代理对象访问这个共享计数器。

运行这个例子,会看到两个工作进程分别对计数器进行了10次加1操作,并打印出计数器的值。由于使用了锁机制,所以我们可以确保计数器的操作是线程安全的,不会出现竞争条件。

这个例子使用了一个简单的计数器来说明SyncManager类的用法,实际上,SyncManager还可以用来共享更复杂的对象,如队列、列表、字典等。只需要定义相应的类,并在其中使用multiprocessing模块提供的共享对象即可。