繁体   English   中英

Python 中的 Queue.queue 多处理 numpy arrays

[英]Multiprocessing with Queue.queue in Python for numpy arrays

我正在阅读使用 OpenCV 和多线程并使用queue.queue顺序存储帧的视频。

此外,我正在尝试利用多处理来并行处理队列中的帧,以进一步加快执行时间。

但我不知道如何有效地将队列中的帧传递给多个进程。

我尝试了multiprocessing.queue但它太慢了。

这是我当前的多处理部分代码:

 with concurrent.futures.ProcessPoolExecutor(max_workers=6) as executor:
    while q.not_empty():       
        frame = q.get()
        futures = executor.submit(func, frame)

这有效,但速度很慢。

如何使用队列对多处理部分进行编码?

使用 Windows 操作系统,所以不能使用fork()

将数组放置到multiprocessing.Queue会创建数组的副本,并分配新的 memory 非常慢。 为避免这种情况,您可以使用multiprocessing.shared_memory在共享 memory 中分配缓冲区。

from multiprocessing import shared_memory

import numpy as np


frame_shape = (720, 1280, 3)
frame_dtype = np.uint8

buffer_size = np.prod(frame_shape) * np.dtype(frame_dtype).itemsize
buffer_name = "frame"

shm = shared_memory.SharedMemory(create=True, size=buffer_size, name=buffer_name)

frame = np.ndarray(shape=frame_shape, dtype=frame_dtype, buffer=shm.buf)

在另一个过程中:

from multiprocessing import shared_memory

import numpy as np


frame_shape = (720, 1280, 3)
frame_dtype = np.uint8

buffer_size = np.prod(frame_shape) * np.dtype(frame_dtype).itemsize
buffer_name = "frame"

shm = shared_memory.SharedMemory(size=buffer_size, name=buffer_name)

frame = np.ndarray(shape=frame_shape, dtype=frame_dtype, buffer=shm.buf)
frame[:, :, :] = np.tile(np.arange(3), reps=(*frame_shape[:2], 1))

回到原来的流程,变化体现在:

frame
array([[[0, 1, 2],
        [0, 1, 2],
        [0, 1, 2],
        ...,

当该清理时,在第二个过程中:

shm.close()

而在原来的过程中:

shm.close()
shm.unlink()

如果您不取消链接SharedMemory object 并且您尝试创建另一个具有相同名称的 object(即使在实例化它的进程完成执行之后),创建将失败,直到您取消链接它。

如果您不维护对SharedMemory object 的引用,它可能会在您完成之前被垃圾收集,因此请确保将其存储在我们上面所做的变量或列表等中。

请注意,您将需要使用某种互斥锁(例如multiprocessing.Lockmultiprocessing.Semaphore )来同步对缓冲区的访问。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM