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
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)

View File

@ -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}")

View File

@ -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)

View File

@ -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),