生成记录接口兼容图片类型|CHAT对话生成视频/图片任务API+celery异步模块完成

This commit is contained in:
2026-05-27 13:11:55 +08:00
parent d61dcdc8db
commit b8eda53c0b
30 changed files with 3392 additions and 45 deletions
+48
View File
@@ -0,0 +1,48 @@
import asyncio
import os
import threading
from typing import Awaitable, TypeVar
T = TypeVar("T")
_thread_local = threading.local()
def _get_or_create_loop() -> asyncio.AbstractEventLoop:
"""
给当前进程/线程维护一个长期 event loop。
Linux prefork
每个 Celery 子进程通常单线程跑任务,这里相当于每个子进程一个长期 loop。
Windows -P threads
每个线程一个 loop,但注意 asyncpg pool 仍不适合跨线程共享;
Windows threads 模式建议继续用 NullPool 或只做本地调试。
"""
pid = os.getpid()
loop = getattr(_thread_local, "loop", None)
loop_pid = getattr(_thread_local, "pid", None)
if loop is None or loop.is_closed() or loop_pid != pid:
loop = asyncio.new_event_loop()
_thread_local.loop = loop
_thread_local.pid = pid
return loop
def run_async(coro: Awaitable[T]) -> T:
"""
Celery 同步 task 调用异步协程的统一入口。
不使用 asyncio.run(),避免每个 task 结束时关闭 event loop。
"""
loop = _get_or_create_loop()
return loop.run_until_complete(coro)
def close_loop() -> None:
loop = getattr(_thread_local, "loop", None)
if loop is not None and not loop.is_closed():
loop.close()
_thread_local.loop = None
_thread_local.pid = None