From 86a0fa84ca6662ca931182880523c0b87f617f73 Mon Sep 17 00:00:00 2001 From: TheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com> Date: Thu, 2 Apr 2026 16:07:20 +0900 Subject: fix: add session lock in StockSelector, remove unused HEALTH_PORT_OFFSET, lint fixes - Add asyncio.Lock to StockSelector._ensure_session() to prevent race condition - Remove unused HEALTH_PORT_OFFSET constant from news-collector - Auto-fix import sorting and formatting from ruff --- services/news-collector/src/news_collector/main.py | 3 --- services/strategy-engine/src/strategy_engine/stock_selector.py | 9 ++++++--- 2 files changed, 6 insertions(+), 6 deletions(-) (limited to 'services') diff --git a/services/news-collector/src/news_collector/main.py b/services/news-collector/src/news_collector/main.py index 7265f00..c39fa67 100644 --- a/services/news-collector/src/news_collector/main.py +++ b/services/news-collector/src/news_collector/main.py @@ -25,9 +25,6 @@ from shared.sentiment import SentimentAggregator from shared.sentiment_models import MarketSentiment from shared.shutdown import GracefulShutdown -# Health check port: base + 4 -HEALTH_PORT_OFFSET = 4 - async def run_collector_once(collector, db: Database, broker: RedisBroker) -> int: """Run a single collector, store results in DB, publish to Redis. diff --git a/services/strategy-engine/src/strategy_engine/stock_selector.py b/services/strategy-engine/src/strategy_engine/stock_selector.py index 5acef0f..8657b93 100644 --- a/services/strategy-engine/src/strategy_engine/stock_selector.py +++ b/services/strategy-engine/src/strategy_engine/stock_selector.py @@ -1,5 +1,6 @@ """3-stage stock selector engine: sentiment → technical → LLM.""" +import asyncio import json import logging import re @@ -218,11 +219,13 @@ class StockSelector: self._model = anthropic_model self._max_picks = max_picks self._http_session: aiohttp.ClientSession | None = None + self._session_lock = asyncio.Lock() async def _ensure_session(self) -> aiohttp.ClientSession: - if self._http_session is None or self._http_session.closed: - self._http_session = aiohttp.ClientSession() - return self._http_session + async with self._session_lock: + if self._http_session is None or self._http_session.closed: + self._http_session = aiohttp.ClientSession() + return self._http_session async def close(self) -> None: if self._http_session and not self._http_session.closed: -- cgit v1.2.3