This commit is contained in:
2026-08-14 14:46:50 +08:00
parent 7c3ef21762
commit 3f18b28227
+13 -4
View File
@@ -1,3 +1,4 @@
import asyncio
import logging import logging
from celery import Celery from celery import Celery
@@ -331,6 +332,9 @@ def _setup_dynamic_beat_tasks(sender, **kwargs):
通过 @celery_app.on_after_configure.connect 在 Celery 配置完成后执行, 通过 @celery_app.on_after_configure.connect 在 Celery 配置完成后执行,
适用于 Worker 和 Beat 启动场景。 适用于 Worker 和 Beat 启动场景。
注意:此信号运行在 Beat/Worker 主线程,不能使用 run_asyncsingle_loop 在另一线程),
这里用独立 event loop 同步运行 async 查询,避免 asyncpg Future 跨 loop 错误。
""" """
if celery_app is None: if celery_app is None:
return return
@@ -345,16 +349,21 @@ def _setup_dynamic_beat_tasks(sender, **kwargs):
result = await db.execute( result = await db.execute(
select(ScheduledTask).where(ScheduledTask.is_active.is_(True)) select(ScheduledTask).where(ScheduledTask.is_active.is_(True))
) )
tasks = result.scalars().all() return result.scalars().all()
return tasks
active_tasks = None
try: try:
active_tasks = run_async(_load()) # 在当前线程创建独立 loop 同步运行,不经过 single_loop
loop = asyncio.new_event_loop()
try:
active_tasks = loop.run_until_complete(_load())
finally:
loop.close()
except Exception: except Exception:
logger.exception("加载定时任务失败,跳过动态 Beat 注册") logger.exception("加载定时任务失败,跳过动态 Beat 注册")
return return
for task in active_tasks: for task in active_tasks or []:
schedule_val = _parse_schedule_to_celery(task.schedule) schedule_val = _parse_schedule_to_celery(task.schedule)
if schedule_val is None: if schedule_val is None:
logger.warning("定时任务 %s schedule 无效,跳过注册: %s", task.id, task.schedule) logger.warning("定时任务 %s schedule 无效,跳过注册: %s", task.id, task.schedule)