Add more processes

This commit is contained in:
Nicolas Mowen 2025-06-12 11:40:02 -06:00
parent 4b913953a1
commit e8dd382280
4 changed files with 39 additions and 68 deletions

View File

@ -65,7 +65,7 @@ from frigate.ptz.onvif import OnvifController
from frigate.record.cleanup import RecordingCleanup from frigate.record.cleanup import RecordingCleanup
from frigate.record.export import migrate_exports from frigate.record.export import migrate_exports
from frigate.record.record import manage_recordings from frigate.record.record import manage_recordings
from frigate.review.review import manage_review_segments from frigate.review.review import ReviewProcess
from frigate.stats.emitter import StatsEmitter from frigate.stats.emitter import StatsEmitter
from frigate.stats.util import stats_init from frigate.stats.util import stats_init
from frigate.storage import StorageMaintainer from frigate.storage import StorageMaintainer
@ -236,12 +236,7 @@ class FrigateApp:
logger.info(f"Recording process started: {recording_process.pid}") logger.info(f"Recording process started: {recording_process.pid}")
def init_review_segment_manager(self) -> None: def init_review_segment_manager(self) -> None:
review_segment_process = util.Process( review_segment_process = ReviewProcess(self.config)
target=manage_review_segments,
name="review_segment_manager",
args=(self.config,),
)
review_segment_process.daemon = True
self.review_segment_process = review_segment_process self.review_segment_process = review_segment_process
review_segment_process.start() review_segment_process.start()
self.processes["review_segment"] = review_segment_process.pid or 0 self.processes["review_segment"] = review_segment_process.pid or 0

View File

@ -18,11 +18,10 @@ from frigate.config.camera.updater import (
) )
from frigate.const import SHM_FRAMES_VAR from frigate.const import SHM_FRAMES_VAR
from frigate.models import Regions from frigate.models import Regions
from frigate.util import Process as FrigateProcess
from frigate.util.builtin import empty_and_close_queue from frigate.util.builtin import empty_and_close_queue
from frigate.util.image import SharedMemoryFrameManager, UntrackedSharedMemory from frigate.util.image import SharedMemoryFrameManager, UntrackedSharedMemory
from frigate.util.object import get_camera_regions_grid from frigate.util.object import get_camera_regions_grid
from frigate.video import CameraTracker, capture_camera from frigate.video import CameraCapture, CameraTracker
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -183,11 +182,7 @@ class CameraMaintainer(threading.Thread):
frame_size = config.frame_shape_yuv[0] * config.frame_shape_yuv[1] frame_size = config.frame_shape_yuv[0] * config.frame_shape_yuv[1]
self.frame_manager.create(f"{config.name}_frame{i}", frame_size) self.frame_manager.create(f"{config.name}_frame{i}", frame_size)
capture_process = FrigateProcess( capture_process = CameraCapture(config, count, self.camera_metrics[name])
target=capture_camera,
name=f"camera_capture:{name}",
args=(config, count, self.camera_metrics[name]),
)
capture_process.daemon = True capture_process.daemon = True
self.capture_processes[name] = capture_process self.capture_processes[name] = capture_process
capture_process.start() capture_process.start()

View File

@ -1,36 +1,23 @@
"""Run recording maintainer and cleanup.""" """Run recording maintainer and cleanup."""
import logging import logging
import multiprocessing as mp
import signal
import threading
from types import FrameType
from typing import Optional
from setproctitle import setproctitle
import frigate.util as util
from frigate.config import FrigateConfig from frigate.config import FrigateConfig
from frigate.review.maintainer import ReviewSegmentMaintainer from frigate.review.maintainer import ReviewSegmentMaintainer
from frigate.util.services import listen
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
def manage_review_segments(config: FrigateConfig) -> None: class ReviewProcess(util.Process):
stop_event = mp.Event() def __init__(self, config: FrigateConfig) -> None:
super().__init__(name="frigate.review_segment_manager", daemon=True)
self.config = config
def receiveSignal(signalNumber: int, frame: Optional[FrameType]) -> None: def run(self) -> None:
stop_event.set() self.pre_run_setup()
maintainer = ReviewSegmentMaintainer(
signal.signal(signal.SIGTERM, receiveSignal) self.config,
signal.signal(signal.SIGINT, receiveSignal) self.stop_event,
)
threading.current_thread().name = "process:review_segment_manager" maintainer.start()
setproctitle("frigate.review_segment_manager")
listen()
maintainer = ReviewSegmentMaintainer(
config,
stop_event,
)
maintainer.start()

View File

@ -1,9 +1,7 @@
import datetime import datetime
import logging import logging
import multiprocessing as mp
import os import os
import queue import queue
import signal
import subprocess as sp import subprocess as sp
import threading import threading
import time import time
@ -12,7 +10,6 @@ from multiprocessing.synchronize import Event as MpEvent
from typing import Any from typing import Any
import cv2 import cv2
from setproctitle import setproctitle
import frigate.util as util import frigate.util as util
from frigate.camera import CameraMetrics, PTZMetrics from frigate.camera import CameraMetrics, PTZMetrics
@ -318,7 +315,7 @@ class CameraWatchdog(threading.Thread):
ffmpeg_cmd, self.logger, self.logpipe, self.frame_size ffmpeg_cmd, self.logger, self.logpipe, self.frame_size
) )
self.ffmpeg_pid.value = self.ffmpeg_detect_process.pid self.ffmpeg_pid.value = self.ffmpeg_detect_process.pid
self.capture_thread = CameraCapture( self.capture_thread = CameraCaptureRunner(
self.config, self.config,
self.shm_frame_count, self.shm_frame_count,
self.frame_index, self.frame_index,
@ -396,7 +393,7 @@ class CameraWatchdog(threading.Thread):
return newest_segment_time return newest_segment_time
class CameraCapture(threading.Thread): class CameraCaptureRunner(threading.Thread):
def __init__( def __init__(
self, self,
config: CameraConfig, config: CameraConfig,
@ -440,31 +437,28 @@ class CameraCapture(threading.Thread):
) )
def capture_camera( class CameraCapture(util.Process):
config: CameraConfig, shm_frame_count: int, camera_metrics: CameraMetrics def __init__(
): self, config: CameraConfig, shm_frame_count: int, camera_metrics: CameraMetrics
stop_event = mp.Event() ) -> None:
super().__init__(name=f"camera_capture:{config.name}", daemon=True)
self.config = config
self.shm_frame_count = shm_frame_count
self.camera_metrics = camera_metrics
def receiveSignal(signalNumber, frame): def run(self) -> None:
stop_event.set() self.pre_run_setup()
camera_watchdog = CameraWatchdog(
signal.signal(signal.SIGTERM, receiveSignal) self.config,
signal.signal(signal.SIGINT, receiveSignal) self.shm_frame_count,
self.camera_metrics.frame_queue,
threading.current_thread().name = f"capture:{config.name}" self.camera_metrics.camera_fps,
setproctitle(f"frigate.capture:{config.name}") self.camera_metrics.skipped_fps,
self.camera_metrics.ffmpeg_pid,
camera_watchdog = CameraWatchdog( self.stop_event,
config, )
shm_frame_count, camera_watchdog.start()
camera_metrics.frame_queue, camera_watchdog.join()
camera_metrics.camera_fps,
camera_metrics.skipped_fps,
camera_metrics.ffmpeg_pid,
stop_event,
)
camera_watchdog.start()
camera_watchdog.join()
class CameraTracker(util.Process): class CameraTracker(util.Process):