Files
market_intel/apps/worker/main.py
T
2026-08-01 10:33:19 +08:00

83 lines
2.3 KiB
Python

"""Worker 入口:周期回填到期结算指数。"""
from __future__ import annotations
import logging
import signal
import sys
import time
from typing import Any
from apps.collector.okx_rest import OkxRestClient
from apps.worker.settle import backfill_settlements
from packages.config import get_settings
from packages.db import Repository
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s %(levelname)s [worker] %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
)
log = logging.getLogger("worker")
_STOP = False
def _handle_signal(signum: int, _frame: Any) -> None:
global _STOP
log.info("signal %s received, stopping…", signum)
_STOP = True
def run() -> int:
settings = get_settings()
interval = max(60, int(settings.settle_backfill_interval_sec))
log.info(
"start settle backfill interval=%ss db=%s",
interval,
settings.db_path,
)
repo = Repository(settings.db_path)
client = OkxRestClient(
base_url=settings.okx_base_url,
proxy=settings.okx_proxy or None,
)
try:
while not _STOP:
try:
result = backfill_settlements(
repo,
underlying=settings.underlying,
index_inst_id=settings.index_inst_id,
client=client,
)
log.info(
"backfill filled=%s skipped=%s errors=%s",
len(result["filled"]),
len(result["skipped"]),
len(result["errors"]),
)
for err in result["errors"][:5]:
log.warning(" %s", err)
except Exception as e: # noqa: BLE001
log.exception("backfill loop failed: %s", e)
end = time.monotonic() + interval
while not _STOP and time.monotonic() < end:
time.sleep(min(1.0, end - time.monotonic()))
finally:
client.close()
repo.close()
log.info("stopped")
return 0
def main() -> None:
signal.signal(signal.SIGINT, _handle_signal)
signal.signal(signal.SIGTERM, _handle_signal)
sys.exit(run())
if __name__ == "__main__":
main()