worker.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. 单线程结构化处理 Worker
  5. 通过 Docker 的副本数实现并发,不再使用应用内多线程调度器。
  6. """
  7. import os
  8. import sys
  9. import time
  10. import signal
  11. sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
  12. from utils.logging_config import get_logger
  13. from structure.structure_processor import StructureProcessor
  14. class StructureWorker:
  15. def __init__(self,
  16. interval_seconds: int = 120,
  17. idle_sleep_seconds: int = 10):
  18. self.interval_seconds = interval_seconds
  19. self.idle_sleep_seconds = idle_sleep_seconds
  20. self.running = True
  21. self.logger = get_logger('StructureWorker')
  22. self.processor = StructureProcessor()
  23. signal.signal(signal.SIGINT, self._handle_signal)
  24. signal.signal(signal.SIGTERM, self._handle_signal)
  25. def _handle_signal(self, signum, frame):
  26. self.logger.info(f"收到信号 {signum},准备优雅退出…")
  27. self.running = False
  28. def run_forever(self):
  29. self.logger.info(f"启动 StructureWorker,间隔: {self.interval_seconds}s,空闲等待: {self.idle_sleep_seconds}s")
  30. while self.running:
  31. start_time = time.time()
  32. try:
  33. processed = self.processor.process_single_record()
  34. if not processed:
  35. time.sleep(self.idle_sleep_seconds)
  36. else:
  37. elapsed = time.time() - start_time
  38. wait_time = max(0, self.interval_seconds - elapsed)
  39. if wait_time > 0:
  40. time.sleep(wait_time)
  41. except Exception as exc:
  42. self.logger.error(f"处理异常: {exc}", exc_info=True)
  43. time.sleep(self.idle_sleep_seconds)
  44. def main():
  45. interval_seconds = int(os.getenv('INTERVAL_SECONDS', '120'))
  46. idle_sleep_seconds = int(os.getenv('IDLE_SLEEP_SECONDS', '10'))
  47. worker = StructureWorker(interval_seconds=interval_seconds,
  48. idle_sleep_seconds=idle_sleep_seconds)
  49. worker.run_forever()
  50. if __name__ == '__main__':
  51. main()