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

使用Python 3的multiprocessing.Value共享字符串失败,求解决方法

解决multiprocessing.Value共享字符串失效的问题

问题原因

你用ctypes.c_wchar_p作为Value的类型是错误的——c_wchar_p是指向宽字符的指针,而每个进程拥有独立的地址空间,子进程里的指针指向的内存地址在其他进程中是无效的,这就导致第二个进程读取时得到空值。

解决方案

方案一:使用固定长度的宽字符数组

通过ctypes.c_wchar * 长度定义固定大小的字符数组,确保共享的是实际字符串内容而非指针:

from multiprocessing import Value, Process
import ctypes

def say_hi(v):
    with v.get_lock():
        # 把数组转为字符串并去除末尾空字符
        current_val = v.value.rstrip('\x00')
        print(f"Saying hi with v.value={current_val}")
        # 写入新字符串,填充空字符到固定长度
        v.value = "borat".ljust(10, '\x00')

if __name__ == "__main__":
    # 创建可容纳10个宽字符的共享变量,初始值为"boris"
    v = Value(ctypes.c_wchar * 10, "boris")
    p1 = Process(target=say_hi, args=(v,))
    p2 = Process(target=say_hi, args=(v,))

    p1.start()
    p1.join()

    p2.start()
    p2.join()

方案二:使用multiprocessing.Manager(灵活支持可变长度)

Manager会创建一个管理进程,负责协调跨进程的变量共享,使用起来更简单:

from multiprocessing import Process, Manager

def say_hi(v):
    with v.get_lock():
        print(f"Saying hi with v.value={v.value}")
        v.value = "borat"

if __name__ == "__main__":
    with Manager() as manager:
        # 创建可共享的字符串变量
        v = manager.Value(str, "boris")
        p1 = Process(target=say_hi, args=(v,))
        p2 = Process(target=say_hi, args=(v,))

        p1.start()
        p1.join()

        p2.start()
        p2.join()

方案对比

  • 方案一:无额外进程开销,但字符串长度固定,需提前预估最大长度。
  • 方案二:支持任意长度字符串,使用更便捷,但依赖Manager进程,有轻微性能损耗。

内容的提问来源于stack exchange,提问作者user1114

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 21:40:27