我想在进程之间创建共享对象。首先,我创建了服务器进程,该进程派生了类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()
,后者将返回一个新实例。