![](/img/trans.png)
[英]Differences between python Queue.Queue and multiprocessing.Queue
[英]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.Lock
或multiprocessing.Semaphore
)来同步对缓冲区的访问。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.