@@ -20,6 +20,7 @@ from app.endpoints.groups_endpoint import groups_router | |||||
from app.endpoints.sns_endpoint import sns_router | from app.endpoints.sns_endpoint import sns_router | ||||
from app.endpoints.agent_endpoint import agent_router | from app.endpoints.agent_endpoint import agent_router | ||||
from app.endpoints.pipeline_endpoint import messages_router | from app.endpoints.pipeline_endpoint import messages_router | ||||
from tasks import background_worker_task | |||||
@@ -31,7 +32,7 @@ from app.middleware import http_context | |||||
from celery.result import AsyncResult | from celery.result import AsyncResult | ||||
from app.tasks import add_task,sync_contacts_task | |||||
from tasks import add_task,sync_contacts_task | |||||
from config import load_config | from config import load_config | ||||
from config import conf | from config import conf | ||||
from common.utils import * | from common.utils import * | ||||
@@ -164,8 +165,29 @@ async def lifespan(app: FastAPI): | |||||
# await kafka_service.stop() | # await kafka_service.stop() | ||||
#task = asyncio.create_task(kafka_consumer()) | #task = asyncio.create_task(kafka_consumer()) | ||||
task=asyncio.create_task(background_worker(redis_service,kafka_service,gewe_service)) | |||||
background_tasks.add(task) | |||||
redis_config = { | |||||
'host': conf().get("redis_host"), | |||||
'port': conf().get("redis_port"), | |||||
'password': conf().get("redis_password"), | |||||
'db': conf().get("redis_db"), | |||||
} | |||||
kafka_config = { | |||||
'bootstrap_servers': KAFKA_BOOTSTRAP_SERVERS, | |||||
'topic': KAFKA_TOPIC, | |||||
'group_id': KAFKA_GROUP_ID, | |||||
} | |||||
gewe_config = { | |||||
'api_url': "http://api.geweapi.com/gewe", | |||||
} | |||||
# Use Celery task | |||||
worker_task = background_worker_task.delay(redis_config, kafka_config, gewe_config) | |||||
background_tasks.add(worker_task) | |||||
environment = os.environ.get('environment', 'default') | |||||
if environment != 'default': | |||||
task=asyncio.create_task(background_worker(redis_service,kafka_service,gewe_service)) | |||||
background_tasks.add(task) | |||||
try: | try: | ||||
yield # 应用程序运行期间 | yield # 应用程序运行期间 | ||||
finally: | finally: | ||||
@@ -1,28 +0,0 @@ | |||||
from app.celery_app import celery | |||||
from fastapi import Request,FastAPI | |||||
import time | |||||
@celery.task(name='app.tasks.add_task', bind=True, acks_late=True) | |||||
def add_task(self, x, y): | |||||
time.sleep(5) # 模拟长时间计算 | |||||
return x + y | |||||
@celery.task(name='app.tasks.mul_task', bind=True, acks_late=True) | |||||
def mul_task(self, x, y): | |||||
time.sleep(5) # 模拟长时间计算 | |||||
return x * y | |||||
# @celery.task(name='app.tasks.sync_contacts', bind=True, acks_late=True) | |||||
# async def sync_contacts_task(self,app): | |||||
# login_keys = list(await app.state.redis_service.client.scan_iter(match='__AI_OPS_WX__:LOGININFO:*')) | |||||
# return login_keys | |||||
# # for k in login_keys: | |||||
# # print(k) | |||||
@celery.task(name='app.tasks.sync_contacts', bind=True, acks_late=True) | |||||
async def sync_contacts_task(self, redis_service): | |||||
# Use the redis_service passed as an argument | |||||
login_keys = list(await redis_service.client.scan_iter(match='__AI_OPS_WX__:LOGININFO:*')) | |||||
return login_keys |
@@ -41,14 +41,41 @@ | |||||
# celery = make_celery(app) | # celery = make_celery(app) | ||||
from celery import Celery | from celery import Celery | ||||
import celery.schedules | |||||
from redbeat import RedBeatSchedulerEntry | |||||
from datetime import timedelta | |||||
# 配置 Celery | # 配置 Celery | ||||
celery = Celery( | |||||
celery_app = Celery( | |||||
"worker", | "worker", | ||||
broker="redis://:telpo%231234@192.168.2.121:8090/3", | broker="redis://:telpo%231234@192.168.2.121:8090/3", | ||||
backend="redis://:telpo%231234@192.168.2.121:8090/3", | backend="redis://:telpo%231234@192.168.2.121:8090/3", | ||||
include=['app.tasks'] | |||||
include=['tasks'] | |||||
) | ) | ||||
# 配置 redbeat 作为 Celery Beat 调度器 | |||||
celery_app.conf.update( | |||||
timezone="Asia/Shanghai", # 设定时区 | |||||
beat_scheduler="redbeat.RedBeatScheduler", # 使用 RedBeat 作为调度器 | |||||
redbeat_redis_url="redis://:telpo%231234@192.168.2.121:8090/3" # redbeat 存储任务调度信息的 Redis | |||||
) | |||||
task_name = "tasks.scheduled_task" | |||||
# 任务执行间隔(每 10 秒执行一次) | |||||
schedule = celery.schedules.schedule(timedelta(seconds=10)) | |||||
# RedBeat 任务唯一 ID | |||||
redbeat_entry = RedBeatSchedulerEntry( | |||||
name="redbeat:scheduled_task", # 任务 ID | |||||
task=task_name, # 任务名称 | |||||
schedule=schedule, # 任务调度时间 | |||||
args=[], | |||||
app=celery_app | |||||
) | |||||
# 保存任务到 Redis | |||||
redbeat_entry.save() | |||||
# 自动发现任务 | # 自动发现任务 | ||||
celery.autodiscover_tasks(['app.tasks']) | |||||
#celery.autodiscover_tasks(['tasks']) |
@@ -55,4 +55,5 @@ pydantic | |||||
aioredis>=2.0.0 | aioredis>=2.0.0 | ||||
requests | requests | ||||
aiokafka | aiokafka | ||||
aiofiles | |||||
aiofiles | |||||
celery-redbeat |
@@ -3,6 +3,7 @@ import sys | |||||
import os | import os | ||||
def start_fastapi(): | def start_fastapi(): | ||||
""" 启动 FastAPI 服务 """ | |||||
environment = os.environ.get('environment', 'default') | environment = os.environ.get('environment', 'default') | ||||
if environment == 'default': | if environment == 'default': | ||||
process = subprocess.Popen(["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]) | process = subprocess.Popen(["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]) | ||||
@@ -10,18 +11,26 @@ def start_fastapi(): | |||||
process = subprocess.Popen(["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "5000"]) | process = subprocess.Popen(["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "5000"]) | ||||
return process | return process | ||||
def start_celery(): | |||||
def start_celery_worker(): | |||||
""" 启动 Celery Worker """ | |||||
if sys.platform == "win32": | if sys.platform == "win32": | ||||
process = subprocess.Popen(["celery", "-A", "app.celery_app", "worker", "--loglevel=info", "-P", "solo"]) | |||||
process = subprocess.Popen(["celery", "-A", "celery_app", "worker", "--loglevel=info", "-P", "solo"]) | |||||
else: | else: | ||||
process = subprocess.Popen(["celery", "-A", "app.celery_app", "worker", "--loglevel=info"]) | |||||
process = subprocess.Popen(["celery", "-A", "celery_app", "worker", "--loglevel=info"]) | |||||
return process | |||||
def start_celery_beat(): | |||||
""" 启动 Celery Beat,使用 RedBeat 作为调度器 """ | |||||
process = subprocess.Popen(["celery", "-A", "celery_app", "beat", "--scheduler", "redbeat.RedBeatScheduler", "--loglevel=info"]) | |||||
return process | return process | ||||
if __name__ == "__main__": | if __name__ == "__main__": | ||||
# 启动 FastAPI 和 Celery | |||||
# 启动 FastAPI、Celery Worker 和 Celery Beat | |||||
fastapi_process = start_fastapi() | fastapi_process = start_fastapi() | ||||
# celery_process = start_celery() | |||||
celery_worker_process = start_celery_worker() | |||||
celery_beat_process = start_celery_beat() | |||||
# 等待子进程完成 | # 等待子进程完成 | ||||
fastapi_process.wait() | fastapi_process.wait() | ||||
# celery_process.wait() | |||||
celery_worker_process.wait() | |||||
celery_beat_process.wait() |
@@ -0,0 +1,88 @@ | |||||
from celery_app import celery_app | |||||
from fastapi import Request,FastAPI | |||||
import time | |||||
from services.redis_service import RedisService | |||||
from services.kafka_service import KafkaService | |||||
from services.gewe_service import GeWeService | |||||
from common.log import logger | |||||
import asyncio | |||||
@celery_app.task(name='tasks.add_task', bind=True, acks_late=True) | |||||
def add_task(self, x, y): | |||||
time.sleep(5) # 模拟长时间计算 | |||||
logger.info('add') | |||||
return x + y | |||||
@celery_app.task(name='tasks.mul_task', bind=True, acks_late=True) | |||||
def mul_task(self, x, y): | |||||
time.sleep(5) # 模拟长时间计算 | |||||
return x * y | |||||
# @celery.task(name='app.tasks.sync_contacts', bind=True, acks_late=True) | |||||
# async def sync_contacts_task(self,app): | |||||
# login_keys = list(await app.state.redis_service.client.scan_iter(match='__AI_OPS_WX__:LOGININFO:*')) | |||||
# return login_keys | |||||
# # for k in login_keys: | |||||
# # print(k) | |||||
@celery_app.task(name='tasks.sync_contacts', bind=True, acks_late=True) | |||||
async def sync_contacts_task(self, redis_service): | |||||
# Use the redis_service passed as an argument | |||||
login_keys = list(await redis_service.client.scan_iter(match='__AI_OPS_WX__:LOGININFO:*')) | |||||
return login_keys | |||||
@celery_app.task(name='tasks.background_worker_task', bind=True, acks_late=True) | |||||
def background_worker_task(self, redis_config, kafka_config, gewe_config): | |||||
async def task(): | |||||
redis_service = RedisService() | |||||
await redis_service.init(**redis_config) | |||||
login_keys = [] | |||||
async for key in redis_service.client.scan_iter(match='__AI_OPS_WX__:LOGININFO:*'): | |||||
login_keys.append(key) | |||||
print(login_keys) | |||||
asyncio.run(task()) | |||||
# @celery.task(name='tasks.background_worker_task', bind=True, acks_late=True) | |||||
# async def background_worker_task(self, redis_config, kafka_config, gewe_config): | |||||
# # Initialize services inside the task | |||||
# redis_service = RedisService() | |||||
# await redis_service.init(**redis_config) | |||||
# login_keys = [] | |||||
# async for key in redis_service.client.scan_iter(match='__AI_OPS_WX__:LOGININFO:*'): # 使用 async for 遍历异步生成器 | |||||
# login_keys.append(key) | |||||
# print(login_keys) | |||||
# kafka_service = KafkaService(**kafka_config) | |||||
# await kafka_service.start() | |||||
# gewe_service = await GeWeService.get_instance(None, gewe_config['api_url']) | |||||
# # Task logic | |||||
# lock_name = "background_wxchat_thread_lock" | |||||
# lock_identifier = str(time.time()) | |||||
# while True: | |||||
# if await redis_service.acquire_lock(lock_name, timeout=10): | |||||
# try: | |||||
# logger.info("分布式锁已成功获取") | |||||
# # Perform task logic | |||||
# finally: | |||||
# await redis_service.release_lock(lock_name, lock_identifier) | |||||
# break | |||||
# else: | |||||
# logger.info("获取分布式锁失败,等待10秒后重试...") | |||||
# await asyncio.sleep(10) | |||||
@celery_app.task(name='tasks.scheduled_task', bind=True, acks_late=True) | |||||
def scheduled_task(self): | |||||
print("🚀 定时任务执行成功!") | |||||
return "Hello from Celery Beat + RedBeat!" |