python 3.8 共享内存示例给出不同的值
python 3.8 shared memory example giving different values
我正在尝试使用 python 3.8 中的新共享内存示例 link https://docs.python.org/3/library/multiprocessing.shared_memory.html
# 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]
我完全错过了什么吗?还有其他人有这个结果吗?
您的 c
数组需要使用与 b
相同的 dtype 创建,但事实并非如此。从显示的输出中,我们可以告诉您在 Windows,其中 NumPy 的默认整数大小是 32 位,而不是 64。您指定的数据类型为 np.int64
用于第二个数组,但 b
使用默认大小 32 位。
对第二个数组使用 np.int_
以使用 NumPy 的默认整数数据类型,或为 a
和 c
指定一个明确的数据类型([=11 也将使用它=], 因为 b
的 dtype 来自 a
).
我正在尝试使用 python 3.8 中的新共享内存示例 link https://docs.python.org/3/library/multiprocessing.shared_memory.html
# 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]
我完全错过了什么吗?还有其他人有这个结果吗?
您的 c
数组需要使用与 b
相同的 dtype 创建,但事实并非如此。从显示的输出中,我们可以告诉您在 Windows,其中 NumPy 的默认整数大小是 32 位,而不是 64。您指定的数据类型为 np.int64
用于第二个数组,但 b
使用默认大小 32 位。
对第二个数组使用 np.int_
以使用 NumPy 的默认整数数据类型,或为 a
和 c
指定一个明确的数据类型([=11 也将使用它=], 因为 b
的 dtype 来自 a
).