forked from Github/frigate
Move more things out of FrigateApp (#13897)
* Moved FrigateApp.init_config() into FrigateConfig.load() * Move frigate config loading into main * Store PlusApi in FrigateConfig * Register SIGTERM handler in main * Ensure logging is setup during config parsing * Removed pointless try * Moved config initialization out of FrigateApp * Made FrigateApp.shm_frame_count into a function * Removed log calls from signal handlers python's logging calls are not re-entrant, which caused at least one of these to deadlock randomly. * Reopen stdout/err on process fork This helps avoid deadlocks (https://github.com/python/cpython/issues/91776). * Make mypy happy * Whoops. I might have forgotten to save. Truly an amateur mistake. * Always call FrigateApp.stop()
This commit is contained in:
@@ -2,6 +2,7 @@ import atexit
|
||||
import logging
|
||||
import multiprocessing as mp
|
||||
import os
|
||||
import sys
|
||||
import threading
|
||||
from collections import deque
|
||||
from contextlib import AbstractContextManager, ContextDecorator
|
||||
@@ -68,6 +69,19 @@ class log_thread(AbstractContextManager, ContextDecorator):
|
||||
self._stop_thread()
|
||||
|
||||
|
||||
# When a multiprocessing.Process exits, python tries to flush stdout and stderr. However, if the
|
||||
# process is created after a thread (for example a logging thread) is created and the process fork
|
||||
# happens while an internal lock is held, the stdout/err flush can cause a deadlock.
|
||||
#
|
||||
# https://github.com/python/cpython/issues/91776
|
||||
def reopen_std_streams() -> None:
|
||||
sys.stdout = os.fdopen(1, "w")
|
||||
sys.stderr = os.fdopen(2, "w")
|
||||
|
||||
|
||||
os.register_at_fork(after_in_child=reopen_std_streams)
|
||||
|
||||
|
||||
# based on https://codereview.stackexchange.com/a/17959
|
||||
class LogPipe(threading.Thread):
|
||||
def __init__(self, log_name: str):
|
||||
|
||||
Reference in New Issue
Block a user