1

我正在用python编写一个多处理系统。其中一个子进程负责使用 cv2 从相机流中读取帧,并将该帧传递给另一个子进程以进行一些操作和预览。问题是为了将消息从一个进程传递到另一个进程,我使用“pickle”模块来序列化消息对象。时间在这里至关重要,所以我使用 numpy.memmap,而不是为每个会被序列化的帧使用 numpy 数组。我想了解的是 python 如何处理 memmap 创建的内存。一旦流读取器对象不再保留对 memmap 对象的引用(在它被腌制和发送之后)会发生什么。框架可以从内存中释放吗?如果不是,那么我是否面临内存问题?python如何知道框架何时不再使用并删除它?

一些示例代码:

import cv2
import numpy as np
from multiprocessing import Queue, Process
import pickle


def second_child_process(queue):

    while True:
        pickled_frame = queue.get()
        fp = pickle.loads(pickled_frame)
        cv2.imshow("Video Window", fp)
        cv2.waitKey(33)


def first_child_process(queue):
    ret = True
    vc = cv2.VideoCapture("/dev/0")
    while (ret):

        memmap_p = np.memmap("/dev/zero", dtype='uint8', mode='w+', shape=(360, 640, 3))
        ret = vc.read(memmap_p)

        p = pickle.dumps(memmap_p)
        queue.put(p)


if __name__ == '__main__':
    queue = Queue(10)
    process1 = Process(target=first_child_process, args=(queue,))
    process2 = Process(target=second_child_process, args=(queue,))

    process1.start()
    process2.start()
    process1.join()

运行此代码不会显示任何内存问题。我仍然想了解为什么。

4

0 回答 0