这是我的具体用例,可以更好地解释问题,但我正在寻找一个通用的解决方案。
我正在使用带有显示 RGB 矩阵的 adafruit LED 显示屏的 Raspberry Pi(此代码在 Python 2 中)。我有一个每 1/n 秒生成 RGB 数据的 python 脚本。
是否有一个包或库允许我在一个进程中以 np.ndarray 的形式连续生成 RGB 数据,并让矩阵脚本对其进行轮询,以便它对 numpy 数组进行近乎实时的进程间通信。
一个简单快速的解决方案是使用numpy.memmap
库。它只是为存储在磁盘上的二进制文件中的数组创建内存映射。通过这种方式,您可以非常轻松且非常快速地在进程之间共享 numpy 数组。
例如,生成 RGB 数据的主要过程可以是:
import numpy as np
myshape = (100,100,3) # my RGB array
shared_array = np.memmap("/tmp/testarray", mode='w+', shape=myshape)
while True:
data = some_function_to_get_rgb_data() # returns a numpy array of myshape
shared_array[:] = data[:]
读取该数组的另一个进程可以是:
import numpy as np
read_shape = (100,100,3)
shared_array = np.memmap("/tmp/testarray", mode='r', shape=read_shape)
while True:
# shared_array will behave as a numpy ndarray
do_something_with_array(shared_array)
只考虑形状必须匹配(dtype
数组的也可以传递给memmap
函数)并且创建文件的进程必须首先运行。在实践中,对主进程所做的任何更改shared_array
都会很快反映在其他进程中。
我已经完成了与 4 个进程同时共享一个 (480,360,21) 数组的测试,从该数组读取和写入所需的时间不到 1 毫秒。