Files
2026-08-26 17:42:00 -04:00

40 lines
1.2 KiB
Python

import logging
import threading
from collections.abc import Sequence
from typing import Any
logger = logging.getLogger(__name__)
class ThreadManager:
"""
Manages multiple threads used to execute given handler tasks.
"""
def __init__(self, handlers: Sequence[Any]) -> None:
self.handlers = handlers
self.threads: list[threading.Thread] = []
def start(self) -> None:
for handler in self.handlers:
thread = threading.Thread(target=handler.run)
thread.daemon = False # Ensure threads are waited for on shutdown
self.threads.append(thread)
thread.start()
def wait(self) -> None:
for thread in self.threads:
thread.join()
def stop(self) -> None:
# Signal all handlers to stop
for handler in self.handlers:
handler.stop_event.set()
# Wait for all threads to finish with timeout
for i, thread in enumerate(self.threads):
if thread.is_alive():
thread.join(timeout=5.0)
if thread.is_alive():
logger.warning(f"Thread {i} ({thread.name}) did not terminate within timeout")