Remove Process types from metrics to allow pickling

This commit is contained in:
George Tsiamasiotis 2024-09-28 23:40:45 +03:00
parent e1796e1edf
commit e10b330b04
4 changed files with 21 additions and 20 deletions

View File

@ -592,19 +592,17 @@ class FrigateApp:
# ensure the capture processes are done # ensure the capture processes are done
for name, camera in self.cameras.items(): for name, camera in self.cameras.items():
capture_process = camera.camera_metrics.capture_process if camera.capture_process is not None:
if capture_process is not None:
logger.info(f"Waiting for capture process for {name} to stop") logger.info(f"Waiting for capture process for {name} to stop")
capture_process.terminate() camera.capture_process.terminate()
capture_process.join() camera.capture_process.join()
# ensure the camera processors are done # ensure the camera processors are done
for name, camera in self.cameras.items(): for name, camera in self.cameras.items():
camera_process = camera.camera_metrics.process if camera.process is not None:
if camera_process is not None:
logger.info(f"Waiting for process for {name} to stop") logger.info(f"Waiting for process for {name} to stop")
camera_process.terminate() camera.process.terminate()
camera_process.join() camera.process.join()
logger.info(f"Closing frame queue for {name}") logger.info(f"Closing frame queue for {name}")
empty_and_close_queue(camera.camera_metrics.frame_queue) empty_and_close_queue(camera.camera_metrics.frame_queue)

View File

@ -1,6 +1,7 @@
import logging import logging
import multiprocessing as mp import multiprocessing as mp
from multiprocessing.synchronize import Event from multiprocessing.synchronize import Event
from typing import Optional
from frigate import util from frigate import util
from frigate.config import FrigateConfig from frigate.config import FrigateConfig
@ -22,6 +23,9 @@ class Camera:
camera_metrics: CameraMetrics camera_metrics: CameraMetrics
ptz_metrics: PTZMetrics ptz_metrics: PTZMetrics
process: Optional[util.Process]
capture_process: Optional[util.Process]
def __init__(self, name: str, config: FrigateConfig): def __init__(self, name: str, config: FrigateConfig):
self.name = name self.name = name
self.config = config self.config = config
@ -57,7 +61,8 @@ class Camera:
), ),
daemon=True, daemon=True,
) )
self.camera_metrics.process = camera_process self.process = camera_process
self.camera_metrics.process_pid.value = camera_process.pid or 0
camera_process.start() camera_process.start()
logger.info(f"Camera processor started for {self.name}: {camera_process.pid}") logger.info(f"Camera processor started for {self.name}: {camera_process.pid}")
@ -77,7 +82,8 @@ class Camera:
), ),
) )
capture_process.daemon = True capture_process.daemon = True
self.camera_metrics.capture_process = capture_process self.capture_process = capture_process
self.camera_metrics.capture_pid.value = capture_process.pid or 0
capture_process.start() capture_process.start()
logger.info(f"Capture process started for {self.name}: {capture_process.pid}") logger.info(f"Capture process started for {self.name}: {capture_process.pid}")

View File

@ -1,7 +1,6 @@
import multiprocessing as mp import multiprocessing as mp
from multiprocessing.sharedctypes import Synchronized from multiprocessing.sharedctypes import Synchronized
from multiprocessing.synchronize import Event from multiprocessing.synchronize import Event
from typing import Optional
class CameraMetrics: class CameraMetrics:
@ -16,8 +15,8 @@ class CameraMetrics:
frame_queue: mp.Queue frame_queue: mp.Queue
process: Optional[mp.Process] process_pid: Synchronized
capture_process: Optional[mp.Process] capture_pid: Synchronized
ffmpeg_pid: Synchronized ffmpeg_pid: Synchronized
def __init__(self): def __init__(self):
@ -32,8 +31,8 @@ class CameraMetrics:
self.frame_queue = mp.Queue(maxsize=2) self.frame_queue = mp.Queue(maxsize=2)
self.process = None self.process_pid = mp.Value("i", 0)
self.capture_process = None self.capture_pid = mp.Value("i", 0)
self.ffmpeg_pid = mp.Value("i", 0) self.ffmpeg_pid = mp.Value("i", 0)

View File

@ -247,11 +247,9 @@ def stats_snapshot(
stats["cameras"] = {} stats["cameras"] = {}
for name, camera_stats in camera_metrics.items(): for name, camera_stats in camera_metrics.items():
total_detection_fps += camera_stats.detection_fps.value total_detection_fps += camera_stats.detection_fps.value
pid = camera_stats.process.pid if camera_stats.process else None pid = camera_stats.process_pid.value or None
ffmpeg_pid = camera_stats.ffmpeg_pid.value if camera_stats.ffmpeg_pid else None capture_pid = camera_stats.capture_pid.value or None
capture_pid = ( ffmpeg_pid = camera_stats.ffmpeg_pid.value or None
camera_stats.capture_process.pid if camera_stats.capture_process else None
)
stats["cameras"][name] = { stats["cameras"][name] = {
"camera_fps": round(camera_stats.camera_fps.value, 2), "camera_fps": round(camera_stats.camera_fps.value, 2),
"process_fps": round(camera_stats.process_fps.value, 2), "process_fps": round(camera_stats.process_fps.value, 2),