使用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
相关产品推荐
相关产品推荐

