【发布时间】:2021-05-31 00:48:41
【问题描述】:
我以为SharedMemory 会保留目标数组的值,但当我实际尝试时,似乎没有。
from multiprocessing import Process, Semaphore, shared_memory
import numpy as np
import time
dtype_eV = np.dtype({ 'names':['idx', 'value', 'size'], \
'formats':['int32', 'float64', 'float64'] })
def worker_writer(id, number, a, shm):
exst_shm = shared_memory.SharedMemory(name=shm)
b = np.ndarray(a.shape, dtype=a.dtype, buffer=exst_shm.buf)
for i in range(5):
time.sleep(0.5)
b['idx'][i] = i
def worker_reader(id, number, a, shm):
exst_shm = shared_memory.SharedMemory(name=shm)
b = np.ndarray(a.shape, dtype=a.dtype, buffer=exst_shm.buf)
for i in range(5):
time.sleep(1)
print(b['idx'][i], b['value'][i])
if __name__ == "__main__":
a = np.zeros(5, dtype=dtype_eV)
a['value'] = 100
shm = shared_memory.SharedMemory(create=True, size=a.nbytes)
c = np.ndarray(a.shape, dtype=a.dtype, buffer=shm.buf)
th1 = Process(target=worker_writer, args=(1, 50000000, a, shm.name))
th2 = Process(target=worker_reader, args=(2, 50000000, a, shm.name))
th1.start()
th2.start()
th1.join()
th2.join()
'''
result:
0 0.0
1 0.0
2 0.0
3 0.0
4 0.0
'''
在上面的代码中,两个进程可以共享一个数组(a)并访问它。但是共享之前给出的值(a['value'] = 100)丢失了。是自然的还是分享后有什么方法可以保持价值?
【问题讨论】:
-
"但是共享之前给出的值(a['value'] = 100) 丢失了。" - 什么?为什么会出现这个值?您将其存储在
a,而不是共享内存中。 -
我不明白
a的意义是什么。很明显,您希望它做一些有用的事情,但您从未读取过存储在那里的任何内容 - 您读取的只是元数据,例如其形状、dtype 和缓冲区大小。 -
@user2357112-supports-monica 谢谢你的回答。我想我误解了这个概念。我认为必须有一个原始数组,并通过 SharedMemory 在进程之间共享。
-
@SergeBallesta: 错误 - 事实上,
buffer确实 指定了要使用的数组的内存。 (有关演示,请参阅 here。)不过,该内存不是写入100的内存。 -
您应该只使用
a来计算nbytes,那么它不是很有用。请改用c。您永远不会将a中包含的任何值传递给 shm 构造函数,那么它如何知道['value'] = 100?