我试图在我的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()
答案 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并不在进程之间共享全局变量空间,而作为参数传递的项目被压缩并按值传递。
这可能与您的问题没有直接关系,但阅读讨论后,我的帮助会指出正确的方向:
答案 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()