我正在用python编写一个多处理系统。子进程之一负责使用cv2从相机流中读取帧,并将该帧传递给另一个子进程以进行一些操作和预览。 问题是,为了将消息从一个进程传递到另一个进程,我使用了“ pickle”模块来序列化消息对象。时间在这里至关重要,因此我不会使用每一个要序列化的帧的numpy数组,而是使用numpy.memmap。 我想了解的是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()
运行此代码不会显示任何内存问题。我还是想了解为什么。