After story 1
This commit is contained in:
+99
@@ -0,0 +1,99 @@
|
||||
"""
|
||||
VideoDetect - Video Classification System
|
||||
|
||||
Main entry point for the worker service.
|
||||
Initializes all components and starts the processing pipeline.
|
||||
"""
|
||||
|
||||
import logging
|
||||
import signal
|
||||
import sys
|
||||
import time
|
||||
from pathlib import Path
|
||||
|
||||
# Add src to path
|
||||
sys.path.insert(0, str(Path(__file__).parent))
|
||||
|
||||
from config_loader import get_config
|
||||
from db_connector import DBConnector
|
||||
from logging_config import setup_logging
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def graceful_shutdown(signum, frame):
|
||||
"""Handle shutdown signals gracefully."""
|
||||
logger.info("Received signal %d, initiating graceful shutdown...", signum)
|
||||
sys.exit(0)
|
||||
|
||||
|
||||
def main():
|
||||
"""Initialize and start the VideoDetect worker."""
|
||||
# Register signal handlers
|
||||
signal.signal(signal.SIGTERM, graceful_shutdown)
|
||||
signal.signal(signal.SIGINT, graceful_shutdown)
|
||||
|
||||
# Load configuration
|
||||
config = get_config()
|
||||
log_config = config.get_section("logging")
|
||||
setup_logging(
|
||||
level=log_config.get("level", "INFO"),
|
||||
log_format=log_config.get("format", "json"),
|
||||
rotation_max_bytes=log_config.get("rotation_max_bytes", 104857600),
|
||||
rotation_backup_count=log_config.get("rotation_backup_count", 10),
|
||||
)
|
||||
|
||||
logger.info("VideoDetect Worker starting...")
|
||||
logger.info("Config: %s", config)
|
||||
|
||||
# Initialize database connection
|
||||
db_config = config.get_section("database")
|
||||
db = DBConnector(
|
||||
host=db_config.get("host", "mariadb"),
|
||||
port=db_config.get("port", 3306),
|
||||
database=db_config.get("name", "videodetect"),
|
||||
user=db_config.get("user", "videodetect"),
|
||||
password=db_config.get("password", "videodetect123"),
|
||||
pool_size=db_config.get("pool_size", 20),
|
||||
pool_min=db_config.get("pool_min", 5),
|
||||
pool_recycle=db_config.get("pool_recycle", 3600),
|
||||
)
|
||||
|
||||
# Verify database connectivity
|
||||
if not db.health_check():
|
||||
logger.error("Cannot connect to database. Exiting.")
|
||||
sys.exit(1)
|
||||
logger.info("Database connection established.")
|
||||
|
||||
# Initialize schema if needed
|
||||
schema_path = Path(__file__).parent.parent / "db" / "schema.sql"
|
||||
if schema_path.exists():
|
||||
db.initialize_schema(str(schema_path))
|
||||
logger.info("Schema initialized.")
|
||||
|
||||
# Verify GPU availability
|
||||
try:
|
||||
import torch
|
||||
if torch.cuda.is_available():
|
||||
gpu_count = torch.cuda.device_count()
|
||||
gpu_name = torch.cuda.get_device_name(0)
|
||||
logger.info("GPU available: %d GPUs, primary: %s", gpu_count, gpu_name)
|
||||
else:
|
||||
logger.warning("CUDA is not available! Processing will be slow.")
|
||||
except ImportError:
|
||||
logger.warning("PyTorch not installed. GPU features disabled.")
|
||||
|
||||
logger.info("Worker initialization complete. Starting processing loop...")
|
||||
|
||||
# TODO: Start scanner, processor, and monitoring services
|
||||
# This is the skeleton - actual processing logic is in subsequent stories
|
||||
|
||||
try:
|
||||
while True:
|
||||
time.sleep(60) # Main loop placeholder
|
||||
except KeyboardInterrupt:
|
||||
logger.info("Worker shutting down.")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user