Initial commit: stock market platform
This commit is contained in:
1
backend/celery_app/__init__.py
Normal file
1
backend/celery_app/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
1
backend/celery_app/tasks/__init__.py
Normal file
1
backend/celery_app/tasks/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
36
backend/celery_app/tasks/market_tasks.py
Normal file
36
backend/celery_app/tasks/market_tasks.py
Normal file
@@ -0,0 +1,36 @@
|
||||
import json
|
||||
import asyncio
|
||||
import redis as sync_redis
|
||||
from celery_app.worker import app
|
||||
from app.core.config import settings
|
||||
from loguru import logger
|
||||
|
||||
|
||||
def _sync_redis():
|
||||
return sync_redis.from_url(settings.REDIS_URL, decode_responses=True)
|
||||
|
||||
|
||||
@app.task(name="celery_app.tasks.market_tasks.refresh_heatmap_cache")
|
||||
def refresh_heatmap_cache():
|
||||
"""Pull all A-share spot quotes and push to Redis cache."""
|
||||
try:
|
||||
from app.services.stock_service import get_all_stocks_spot
|
||||
data = asyncio.run(get_all_stocks_spot())
|
||||
r = _sync_redis()
|
||||
r.setex("market:heatmap", 60, json.dumps(data))
|
||||
logger.info(f"Heatmap cache refreshed: {len(data)} stocks")
|
||||
except Exception as e:
|
||||
logger.error(f"refresh_heatmap_cache error: {e}")
|
||||
|
||||
|
||||
@app.task(name="celery_app.tasks.market_tasks.refresh_market_overview")
|
||||
def refresh_market_overview():
|
||||
"""Pull major index data and push to Redis cache."""
|
||||
try:
|
||||
from app.services.stock_service import get_market_overview
|
||||
data = asyncio.run(get_market_overview())
|
||||
r = _sync_redis()
|
||||
r.setex("market:overview", 120, json.dumps(data))
|
||||
logger.info(f"Market overview refreshed: {len(data)} indices")
|
||||
except Exception as e:
|
||||
logger.error(f"refresh_market_overview error: {e}")
|
||||
31
backend/celery_app/worker.py
Normal file
31
backend/celery_app/worker.py
Normal file
@@ -0,0 +1,31 @@
|
||||
from celery import Celery
|
||||
from celery.schedules import crontab
|
||||
import os
|
||||
import sys
|
||||
|
||||
app = Celery(
|
||||
"stock_worker",
|
||||
broker=os.getenv("CELERY_BROKER_URL", "redis://localhost:6379/1"),
|
||||
backend=os.getenv("REDIS_URL", "redis://localhost:6379/0"),
|
||||
include=["celery_app.tasks.market_tasks"],
|
||||
)
|
||||
|
||||
app.conf.timezone = "Asia/Shanghai"
|
||||
app.conf.enable_utc = False
|
||||
|
||||
# Windows does not support the default prefork pool (fork syscall unavailable)
|
||||
if sys.platform == "win32":
|
||||
app.conf.worker_pool = "solo"
|
||||
|
||||
app.conf.beat_schedule = {
|
||||
# Refresh heatmap cache every 30s during trading hours
|
||||
"refresh-heatmap-30s": {
|
||||
"task": "celery_app.tasks.market_tasks.refresh_heatmap_cache",
|
||||
"schedule": 30.0,
|
||||
},
|
||||
# Refresh index data every minute
|
||||
"refresh-indices-1m": {
|
||||
"task": "celery_app.tasks.market_tasks.refresh_market_overview",
|
||||
"schedule": 60.0,
|
||||
},
|
||||
}
|
||||
Reference in New Issue
Block a user