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

用于多处理的Python共享字符串内存,python,synchronization,multiprocessing,Python,Synchronization,Multiprocessing,我试图在Python进程之间使用一个共享字符串变量,但似乎我做错了什么,因为我得到了coredumps和无效的内存值 我使用multiprocessing.Value创建ctypes.c\u char\u p值,并使用Value属性访问它。在我对Python文档的理解中,value属性应该是同步的,只要它是value的实例(与RawValue的实例相反)。到目前为止这是正确的吗 我创建了一个简短的示例来演示我对Value的使用,并展示执行时的不一致性: from multiprocessing

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

我使用
multiprocessing.Value
创建
ctypes.c\u char\u 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()

我认为问题可能是由于使用
Value(c\u char\u p)
保存字符串值引起的。如果您想要一个字符串,您可能只需要使用Python参考中的
multiprocessing.Array(c_char)

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

您可以从数组模块引用的表中获取数据类型的标识符:

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

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


这在功能上与您的示例非常相似,但略有不同。请注意,子进程在获得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()

这就成功了。我刚刚在文档中找到了一个很小但很重要的部分:。我没有记住,
c\u char\u p
实际上是一个指针。这里重要的是在
多处理上。数组(c\u char,)
应该被传递最大长度的字符串,该字符串计划保留在这个变量中(因为数组有固定的长度)。Windows和Linux在进程之间都没有全局变量空间。IPC就是在这里诞生的,我们需要共享内存。