python多处理管理器connect创建另一个对象



我想在进程之间创建共享对象。首先,我创建了服务器进程,该进程派生了类ProcessClass的进程。然后我创建了另一个进程,我想在其中连接到共享对象。

但来自另一个进程的连接创建了自己的ProcessClass实例。所以我需要做什么来访问这个远程共享对象。这是我的测试代码。

from multiprocessing.managers import BaseManager
from multiprocessing import Process

class ProcessClass:
def __init__(self):
self._state = False
def set(self):
self._state = True
def get(self):
return self._state

class MyManager(BaseManager):
pass

def another_process():
MyManager.register('my_object')
m = MyManager(address=('', 50000))
m.connect()
proxy = m.my_object()
print(f'state from another process: {proxy.get()}')

def test_spawn_and_terminate_process():
MyManager.register('my_object', ProcessClass)
m = MyManager(address=('', 50000))
m.start()
proxy = m.my_object()
proxy.set()
print(f'state from main process: {proxy.get()}')
p = Process(target=another_process)
p.start()
p.join()
print(f'state from main process: {proxy.get()}')

if __name__ == '__main__':
test_spawn_and_terminate_process()

输出为

python test_communication.py
state from main process: True
state from another process: False
state from main process: True

您的代码正在按预期工作。如果查看multiprocessing.managers.SyncManager的文档,您会发现,例如,有一个方法dict()可以创建一个可共享的字典。您是否期望多次调用此方法会一次又一次地返回相同的字典,或者返回可共享字典的新实例?

您需要做的是强制一个singleton实例在连续调用proxy = m.my_object()时重复使用,方法是首先定义以下函数:

singleton = None
def get_singleton_process_instance():
global singleton
if singleton is None:
singleton = ProcessClass()
return singleton

然后你需要在函数test_spawn_and_terminate_process:中进行一行更改

def test_spawn_and_terminate_process():
#MyManager.register('my_object', ProcessClass)
MyManager.register('my_object', get_singleton_process_instance)

这确保了为了满足对"my_object"的请求,它总是调用get_singleton_process_instance()(返回单例(,而不是ProcessClass(),后者将返回一个新实例。