#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 单线程结构化处理 Worker 通过 Docker 的副本数实现并发,不再使用应用内多线程调度器。 """ import os import sys import time import signal sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from utils.logging_config import get_logger from structure.structure_processor import StructureProcessor class StructureWorker: def __init__(self, interval_seconds: int = 120, idle_sleep_seconds: int = 10): self.interval_seconds = interval_seconds self.idle_sleep_seconds = idle_sleep_seconds self.running = True self.logger = get_logger('StructureWorker') self.processor = StructureProcessor() signal.signal(signal.SIGINT, self._handle_signal) signal.signal(signal.SIGTERM, self._handle_signal) def _handle_signal(self, signum, frame): self.logger.info(f"收到信号 {signum},准备优雅退出…") self.running = False def run_forever(self): self.logger.info(f"启动 StructureWorker,间隔: {self.interval_seconds}s,空闲等待: {self.idle_sleep_seconds}s") while self.running: start_time = time.time() try: processed = self.processor.process_single_record() if not processed: time.sleep(self.idle_sleep_seconds) else: elapsed = time.time() - start_time wait_time = max(0, self.interval_seconds - elapsed) if wait_time > 0: time.sleep(wait_time) except Exception as exc: self.logger.error(f"处理异常: {exc}", exc_info=True) time.sleep(self.idle_sleep_seconds) def main(): interval_seconds = int(os.getenv('INTERVAL_SECONDS', '120')) idle_sleep_seconds = int(os.getenv('IDLE_SLEEP_SECONDS', '10')) worker = StructureWorker(interval_seconds=interval_seconds, idle_sleep_seconds=idle_sleep_seconds) worker.run_forever() if __name__ == '__main__': main()