Python 在多进程中共享字符串内存

6 投票
4 回答
9432 浏览
提问于 2025-04-18 07:20

我正在尝试在我的Python进程之间使用一个共享的字符串变量,但似乎我做错了什么,因为我遇到了核心转储和无效的内存值。

我使用 multiprocessing.Value 来创建一个 ctypes.c_char_p 类型的值,并通过 value 属性来访问它。根据我对Python文档的理解,只要是 Value 的实例,value 属性应该是同步的(与 RawValue 的实例相反)。这样理解对吗?

我创建了一个简短的示例来演示我如何使用 Value,并展示在执行过程中出现的不一致性:

from multiprocessing import Process, Value
from ctypes import c_char_p

def process(v):
    while True:
        val = v.value
        print val
        while val == v.value:
            pass

v = Value(c_char_p, None)
p = Process(target=process, args=(v,))
p.start()

for i in range(1,999):
    v.value = str(i)

p.terminate()

4 个回答

0

我遇到过类似的问题,当时我试图设置多个进程来访问一个共享的输入输出资源。看起来在Windows系统中,进程之间并不会共享全局变量的空间,而且作为参数传递的内容会被压缩并按值传递。

这可能和你的问题没有直接关系,但阅读这个讨论可能会帮助你找到解决问题的方向:

使用串行对象作为参数的多进程

2

这和你的例子功能上很相似,但有一些细微的不同。注意,当子进程收到一个叫做None的信号时,它会自己结束。为了让轮询循环消耗更少的CPU资源,如果使用超时设置会更好。

from multiprocessing import Process, Pipe

def show_numbers(consumer):
    while True:
        if consumer.poll():
           val = consumer.recv()
           if val==None:
              break
           print(val)

(consumer,producer) = Pipe(False)
proc = Process(target=show_numbers, args=(consumer,))
proc.start()

for i in range(1,999):
    producer.send(str(i))

producer.send(None)

proc.join()
2

来自Python的参考资料:

https://docs.python.org/2/library/multiprocessing.html

your_string = Array('B', range(LENGHT))

你可以从数组模块的参考表中获取数据类型的标识符,具体可以查看这里:

https://docs.python.org/2/library/array.html

7

我觉得这个问题可能是因为用 Value(c_char_p) 来保存字符串造成的。如果你想要一个字符串,可能直接用 multiprocessing.Array(c_char) 会更好。

撰写回答