|
|
@@ -0,0 +1,66 @@
|
|
|
+from pathlib import Path
|
|
|
+import sys
|
|
|
+from typing import Dict,Any
|
|
|
+
|
|
|
+import httpx
|
|
|
+import redis
|
|
|
+from src.services.subscription_manager import SubscriptionManager
|
|
|
+from utils.config import config,APP_PATH
|
|
|
+from utils.process_mgr import process_manager
|
|
|
+
|
|
|
+import asyncio
|
|
|
+from utils.logu import get_logger,logger
|
|
|
+import os
|
|
|
+
|
|
|
+
|
|
|
+class CeleryWorker:
|
|
|
+ async def run(self):
|
|
|
+ python_exe = sys.executable
|
|
|
+ WORKER_DIR_BASE = APP_PATH.parent.parent
|
|
|
+ logger.info(f"{WORKER_DIR_BASE}")
|
|
|
+ # return
|
|
|
+ redis_cmd = [config.redis_exe]
|
|
|
+ logger.info(f"{redis_cmd}")
|
|
|
+ flower_db = WORKER_DIR_BASE / 'output' / 'flower_db'
|
|
|
+ await process_manager.start_process("redis_cmd", redis_cmd, cwd=WORKER_DIR_BASE)
|
|
|
+ # G:\code\upwork\zhang_crawl_bio\crawl_env\python.exe -m celery -A worker.celery.app flower --address=127.0.0.1 --persistent=True --db=".\output\flower_db"
|
|
|
+ flower_cmd = [python_exe, '-m', 'celery', '-A', 'worker.celery.app', 'flower', '--address=127.0.0.1', '--persistent=True', f'--db={flower_db}']
|
|
|
+ await process_manager.start_process("flower", flower_cmd, cwd=WORKER_DIR_BASE)
|
|
|
+ proces = process_manager.processes.get("flower").get('process')
|
|
|
+
|
|
|
+ search_worker_name = 'search'
|
|
|
+ crawl_worker_name = 'crawl'
|
|
|
+ convert_worker_name = 'convert'
|
|
|
+ worker_list = [search_worker_name, crawl_worker_name, convert_worker_name]
|
|
|
+ for worker_name in worker_list:
|
|
|
+ await process_manager.start_process(f"{worker_name}_worker", [python_exe, '-m', 'celery', '-A', 'worker.celery.app', 'worker', '-Q',f'{worker_name}_queue', f'--hostname={worker_name}@%h'], cwd=WORKER_DIR_BASE)
|
|
|
+
|
|
|
+ async def check_worker_status(self) -> Dict[str, Any]:
|
|
|
+ flower_url = "http://127.0.0.1:5555/workers?json=1"
|
|
|
+ async with httpx.AsyncClient() as client:
|
|
|
+ try:
|
|
|
+ response = await client.get(flower_url)
|
|
|
+ response.raise_for_status()
|
|
|
+ workers_status = response.json()
|
|
|
+ # 检查 Redis 状态
|
|
|
+ redis_status = await self.check_redis_status()
|
|
|
+
|
|
|
+ # 合并 Worker 状态和 Redis 状态
|
|
|
+ return {"err": 0, "msg": "success", "workers": workers_status, "redis": redis_status}
|
|
|
+ except httpx.HTTPStatusError as e:
|
|
|
+ return {"err": 1, "msg": f"HTTP error occurred: {e}"}
|
|
|
+ except Exception as e:
|
|
|
+ return {"err": 1, "msg": f"An error occurred: {e}"}
|
|
|
+
|
|
|
+ async def check_redis_status(self) -> Dict[str, Any]:
|
|
|
+ # 检查 Redis 服务是否可访问
|
|
|
+ try:
|
|
|
+ redis_client = redis.Redis(host='127.0.0.1', port=6379, db=1)
|
|
|
+ ping_response = redis_client.ping()
|
|
|
+ if ping_response:
|
|
|
+ return {"err": 0, "msg": "Redis is running and accessible"}
|
|
|
+ else:
|
|
|
+ return {"err": 1, "msg": "Redis is running but not responding correctly"}
|
|
|
+ except Exception as e:
|
|
|
+ return {"err": 1, "msg": f"Failed to connect to Redis: {e}"}
|
|
|
+
|