在两个多处理过程之间无延迟地共享大型numpy数组(图像)

时间:2017-11-22 08:29:39

标签: python multithreading numpy multiprocessing shared-memory

我想知道从一个进程写一个大图像并将其传递给另一个进程的最快方法。我有一个儿童过程,不断从相机读取图像(形状:(1080,1920,3))。从父进程,我想在需要时获取最新的图像。相机的刷新率为30 fps。

我尝试使用多处理队列,如下所示,但我注意到,当将图像放入队列时,需要很长时间并将处理周期延迟到10 Hz左右。

#Parent process:
    self.queue = mp.Queue(maxsize=1)
    self.stop_process = mp.Event()
    self.process = mp.Process(target=child_process, args=(self.queue, self.stop_process))
    self.process.daemon = True
    self.process.start()

    # Later, get the queued image
    while True:
        image = self.queue.get(block=True)

#Child process:
def child_process(queue, stop):
     while not stop.is_set():
        try:
                image = retrieve_image()  # Using camera's API
                while True:
                    try:
                        queue.get(block=False)
                    except original_queue.Empty:
                        break
                queue.put(image)
        except:
            log.exception('Exception while reading')
            break

我也试过多处理Pipe,但结果是一样的。然后,我尝试不使用队列或管道,而是使用共享数组(主要称为:http://thousandfold.net/cz/2014/05/01/sharing-numpy-arrays-between-processes-using-multiprocessing-and-ctypes/)。这是代码。不幸的是,它也没有改善延迟。顺便说一句,我无法使用shape:(1080,1920,3)作为sharedctypes数组,因为当我设置它时,程序崩溃了,如interrupted by signal 11 SIGSEGV这样的错误消息。因此,我刚刚使用了扁平化阵列并稍后重新整形,我认为这对性能不利。

#Parent process:
self.shared_array = sharedctypes.Array(np.ctypeslib.as_ctypes(np.zeros(1920*1080*3))._type_, np.ctypeslib.as_ctypes(np.zeros(1920*1080*3)), lock=True)    self.stop_process = mp.Event()
self.process = mp.Process(target=child_process, args=(self.queue, self.stop_process))
self.process.daemon = True
self.process.start()

# Later, get the image from shared array
image = np.frombuffer(self.shared_array.get_obj()).reshape((1080, 1920, 3)).astype('uint8')

#Child process:
def child_process(shared_array, stop):
   while not stop.is_set():
        try:
                shared_array[:] = retrieve_image()  # Using camera's API
        except:
                log.exception('Exception while reading')
                break

现在,我不确定我还能尝试什么。我试图在SO上找到类似的解决方案,但答案(例如Use numpy array in shared memory for multiprocessingHow do I pass large numpy arrays between python subprocesses without saving to disk?)是旧的(有时建议使用未维护的包:https://bitbucket.org/cleemesser/numpy-sharedmem/src)。此外,这些方法看起来类似于我尝试使用共享阵列。

如果您有任何建议或发现我犯的任何错误,请告诉我。

0 个答案:

没有答案