Python共享字符串内存用于多处理

时间:2014-05-22 20:11:45

标签: python synchronization multiprocessing

我试图在我的Python进程之间使用共享字符串变量,但似乎我做错了,因为我得到了coredumps和无效的内存值。

我使用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 :(得分:4)

我认为问题可能是由使用Value(c_char_p)来保存字符串值引起的。如果你想要一个字符串,你应该只使用multiprocessing.Array(c_char)

答案 1 :(得分:1)

从Python-reference: https://docs.python.org/2/library/multiprocessing.html

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

您可以从数组模块引用中获取表中数据类型的标识符: https://docs.python.org/2/library/array.html

答案 2 :(得分:0)

当我尝试设置多个进程来访问共享I / O资源时,我遇到了类似的问题。看起来Windows并不在进程之间共享全局变量空间,而作为参数传递的项目被压缩并按值传递。

这可能与您的问题没有直接关系,但阅读讨论后,我的帮助会指出正确的方向:

Multiprocess with Serial Object as Parameter

答案 3 :(得分:0)

这与你的例子非常相似,虽然略有不同。请注意,子进程在获得None sentinel时会自行终止。如果要使用超时,轮询循环可能会消耗更少的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()