diff --git a/frigate/app.py b/frigate/app.py index 6fdfdb125..796271908 100644 --- a/frigate/app.py +++ b/frigate/app.py @@ -592,19 +592,17 @@ class FrigateApp: # ensure the capture processes are done for name, camera in self.cameras.items(): - capture_process = camera.camera_metrics.capture_process - if capture_process is not None: + if camera.capture_process is not None: logger.info(f"Waiting for capture process for {name} to stop") - capture_process.terminate() - capture_process.join() + camera.capture_process.terminate() + camera.capture_process.join() # ensure the camera processors are done 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") - camera_process.terminate() - camera_process.join() + camera.process.terminate() + camera.process.join() logger.info(f"Closing frame queue for {name}") empty_and_close_queue(camera.camera_metrics.frame_queue) diff --git a/frigate/camera/camera.py b/frigate/camera/camera.py index 041d3d6b2..10a31b0a0 100644 --- a/frigate/camera/camera.py +++ b/frigate/camera/camera.py @@ -1,6 +1,7 @@ import logging import multiprocessing as mp from multiprocessing.synchronize import Event +from typing import Optional from frigate import util from frigate.config import FrigateConfig @@ -22,6 +23,9 @@ class Camera: camera_metrics: CameraMetrics ptz_metrics: PTZMetrics + process: Optional[util.Process] + capture_process: Optional[util.Process] + def __init__(self, name: str, config: FrigateConfig): self.name = name self.config = config @@ -57,7 +61,8 @@ class Camera: ), 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() logger.info(f"Camera processor started for {self.name}: {camera_process.pid}") @@ -77,7 +82,8 @@ class Camera: ), ) 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() logger.info(f"Capture process started for {self.name}: {capture_process.pid}") diff --git a/frigate/camera/metrics.py b/frigate/camera/metrics.py index 456751c52..5da7b475b 100644 --- a/frigate/camera/metrics.py +++ b/frigate/camera/metrics.py @@ -1,7 +1,6 @@ import multiprocessing as mp from multiprocessing.sharedctypes import Synchronized from multiprocessing.synchronize import Event -from typing import Optional class CameraMetrics: @@ -16,8 +15,8 @@ class CameraMetrics: frame_queue: mp.Queue - process: Optional[mp.Process] - capture_process: Optional[mp.Process] + process_pid: Synchronized + capture_pid: Synchronized ffmpeg_pid: Synchronized def __init__(self): @@ -32,8 +31,8 @@ class CameraMetrics: self.frame_queue = mp.Queue(maxsize=2) - self.process = None - self.capture_process = None + self.process_pid = mp.Value("i", 0) + self.capture_pid = mp.Value("i", 0) self.ffmpeg_pid = mp.Value("i", 0) diff --git a/frigate/stats/util.py b/frigate/stats/util.py index d949ffee9..ad2f59f73 100644 --- a/frigate/stats/util.py +++ b/frigate/stats/util.py @@ -247,11 +247,9 @@ def stats_snapshot( stats["cameras"] = {} for name, camera_stats in camera_metrics.items(): total_detection_fps += camera_stats.detection_fps.value - pid = camera_stats.process.pid if camera_stats.process else None - ffmpeg_pid = camera_stats.ffmpeg_pid.value if camera_stats.ffmpeg_pid else None - capture_pid = ( - camera_stats.capture_process.pid if camera_stats.capture_process else None - ) + pid = camera_stats.process_pid.value or None + capture_pid = camera_stats.capture_pid.value or None + ffmpeg_pid = camera_stats.ffmpeg_pid.value or None stats["cameras"][name] = { "camera_fps": round(camera_stats.camera_fps.value, 2), "process_fps": round(camera_stats.process_fps.value, 2),