如何在主进程中获取multiprocessing.Value的实时更新值?
问题分析
你遇到的问题根源在于ctypes.c_wchar_p是宽字符指针类型,多进程拥有独立的地址空间,子进程修改的是自身地址空间内的指针指向,主进程的指针依然指向初始的内存区域,因此无法读取到子进程更新后的值。
解决方案
下面提供两种可行的解决方式:
方式一:使用multiprocessing.Manager共享字符串
Manager会创建独立的管理进程协调跨进程数据共享,能直接处理字符串这类可变对象的进程间访问:
from multiprocessing import Process, Manager import time def func(shared_value): shared_value.value = "xyz" print('updated value to xyz') class Test(): def __init__(self, shared_value): self.shared_value = shared_value def call(self): time.sleep(2) print(self.shared_value.value) if __name__ == "__main__": with Manager() as manager: new_value = manager.Value(str, "abc") p1 = Process(target=func, args=(new_value,)) p1.start() x = Test(new_value) x.call() p1.join()
方式二:使用固定长度的宽字符数组
改用ctypes.c_wchar * 固定长度定义共享字符缓冲区,共享实际内存内容而非指针,子进程修改后主进程可直接读取:
from multiprocessing import Process, Value import ctypes import time # 定义长度为10的宽字符数组,可根据实际需求调整长度 new_value = Value(ctypes.c_wchar * 10, "abc") def func(): global new_value new_value.value = "xyz" print('updated value to xyz') class Test(): def __init__(self): global new_value def call(self): time.sleep(2) print(new_value.value.strip('\x00')) # 去除字符串末尾的空字符 if __name__ == "__main__": p1 = Process(target=func, args=()) p1.start() x = Test() x.call() p1.join()
说明
- 方式一的
Manager更灵活,支持多数Python内置类型,无需手动处理内存大小,但会有轻微性能开销(依赖管理进程)。 - 方式二更轻量,直接共享内存,但需要提前确定字符串最大长度,读取时需处理末尾空字符。
内容的提问来源于stack exchange,提问作者aste123
相关产品推荐
相关产品推荐

