You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在主进程中获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 08:47:37