python 3.8共享内存示例给出不同的值

问题描述 投票:0回答:1

我正在尝试从此链接https://docs.python.org/3/library/multiprocessing.shared_memory.html使用python 3.8中的新共享内存示例

# In the first Python interactive shell
import numpy as np
a = np.array([1, 1, 2, 3, 5, 8])  # Start with an existing NumPy array
from multiprocessing import shared_memory
shm = shared_memory.SharedMemory(create=True, size=a.nbytes)
# Now create a NumPy array backed by shared memory
b = np.ndarray(a.shape, dtype=a.dtype, buffer=shm.buf)
b[:] = a[:]  # Copy the original data into shared memory
shname = shm.name  # We did not specify a name so one was chosen for us
print(shname)
print(a)
print(b)

# In either the same shell or a new Python shell on the same machine
import numpy as np
from multiprocessing import shared_memory
# Attach to the existing shared memory block
existing_shm = shared_memory.SharedMemory(name=shname)
# Note that a.shape is (6,) and a.dtype is np.int64 in this example
c = np.ndarray((6,), dtype=np.int64, buffer=existing_shm.buf)
print(c)
c[-1] = 888
print(c)
# Back in the first Python interactive shell, b reflects this change

# Clean up from within the second Python shell
del c  # Unnecessary; merely emphasizing the array is no longer used
existing_shm.close()

# Clean up from within the first Python shell
del b  # Unnecessary; merely emphasizing the array is no longer used
shm.close()
shm.unlink()  # Free and release the shared memory block at the very end

在示例中,c的输出应为array([1, 1, 2, 3, 5, 8]),但是当我运行此命令时,得到:

wnsm_26020d1b
[1 1 2 3 5 8]
[1 1 2 3 5 8]
[ 4294967297 12884901890 34359738373           0           0           0]
[ 4294967297 12884901890 34359738373           0           0         888]

我完全错过了什么吗?其他人有这个结果吗?

python shared-memory python-3.8
1个回答
0
投票

您的c数组需要使用与b相同的dtype创建,但不是。从显示的输出中,我们可以知道您在Windows上,NumPy的默认整数大小为32位,而不是64。您为第二个数组指定了np.int64的dtype,但是b为使用默认的32位大小。

对第二个数组使用np.int_以使用NumPy的默认整数dtype,或者为ac指定一个显式dtype(b也将使用它,因为b的dtype来自a)。

© www.soinside.com 2019 - 2024. All rights reserved.