用于多处理的Python共享字符串内存
我试图在Python进程之间使用一个共享字符串变量,但似乎我做错了什么,因为我得到了coredumps和无效的内存值 我使用用于多处理的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
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就是在这里诞生的,我们需要共享内存。