diff --git a/app/services/alpaca_price_service.py b/app/services/alpaca_price_service.py index 7a4d24f..f187a69 100644 --- a/app/services/alpaca_price_service.py +++ b/app/services/alpaca_price_service.py @@ -2,6 +2,7 @@ Alpaca bars → AlpacaPriceData conversion and DB storage """ +import asyncio import logging from datetime import datetime, timezone from typing import Dict, List, Optional @@ -84,6 +85,7 @@ class AlpacaPriceService: stmt = stmt.on_conflict_do_nothing(constraint='uq_alpaca_price_data') result = await db.execute(stmt) inserted += result.rowcount + await asyncio.sleep(0) # yield event loop between chunks await db.commit() if inserted: @@ -183,6 +185,7 @@ class AlpacaPriceService: stmt = pg_insert(AlpacaPriceData).values(rows[i : i + CHUNK]) stmt = stmt.on_conflict_do_nothing(constraint="uq_alpaca_price_data") await db.execute(stmt) + await asyncio.sleep(0) # yield event loop between chunks await db.commit() logger.info( f"Alpaca multi-bars: stored {len(rows)} rows for {len(need_fetch)} tickers" @@ -203,6 +206,7 @@ class AlpacaPriceService: .order_by(AlpacaPriceData.ticker, AlpacaPriceData.date) ) db_rows = result.scalars().all() + await asyncio.sleep(0) # yield after bulk ORM object creation data: Dict[str, List[AlpacaPriceData]] = {t: [] for t in upper_tickers} for row in db_rows: diff --git a/docker-compose.yml b/docker-compose.yml index 144b6b8..626ca19 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -66,7 +66,7 @@ services: - ./yfinance_plus:/app/yfinance_plus # Mount yfinance_plus for development - ./data:/app/data # For data files restart: unless-stopped - command: ["python", "-m", "uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "18000", "--reload", "--limit-concurrency", "100"] + command: ["python", "-m", "uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "18000", "--reload", "--limit-concurrency", "20"] # Frontend Application frontend: