2026-03-31 18:16:28 +08:00
|
|
|
# src/server/canvas_generate_3D/tasks.py
|
2026-04-01 11:57:25 +08:00
|
|
|
import asyncio
|
2026-03-31 18:16:28 +08:00
|
|
|
from celery import shared_task
|
2026-04-01 11:57:25 +08:00
|
|
|
import httpx
|
2026-03-31 18:16:28 +08:00
|
|
|
from src.core.config import settings
|
2026-04-02 11:30:34 +08:00
|
|
|
from src.server.canvas_generate_3D.callback import notify_callback
|
2026-04-01 11:57:25 +08:00
|
|
|
from src.server.utils.mq_util import send_to_rabbitmq
|
2026-03-31 18:16:28 +08:00
|
|
|
import logging
|
|
|
|
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@shared_task(bind=True, queue="img_to_3d_queue", max_retries=3, name='src.server.canvas_generate_3D.tasks.img_to_3d_task')
|
2026-04-02 11:30:34 +08:00
|
|
|
def img_to_3d_task(self, input_images: list, model: str = "single", callback_url: str = None):
|
2026-03-31 18:16:28 +08:00
|
|
|
"""img_to_3D 主任务"""
|
2026-04-02 11:55:01 +08:00
|
|
|
task_id = self.request.id
|
|
|
|
|
logger.info(f"开始处理 img_to_3D 任务 | task_id: {task_id}")
|
2026-03-31 18:16:28 +08:00
|
|
|
try:
|
|
|
|
|
input_data = {
|
2026-04-01 11:57:25 +08:00
|
|
|
"image_paths": input_images,
|
2026-03-31 18:16:28 +08:00
|
|
|
"model": model,
|
|
|
|
|
}
|
2026-04-01 11:57:25 +08:00
|
|
|
with httpx.Client(timeout=300.0) as client:
|
2026-03-31 18:16:28 +08:00
|
|
|
resp = client.post(
|
|
|
|
|
f"http://{settings.IMAGE_TO_3D_MODEL_URL}/canvas/img_to_3D",
|
|
|
|
|
json=input_data
|
|
|
|
|
)
|
2026-04-02 11:30:34 +08:00
|
|
|
status_code = resp.status_code
|
2026-03-31 18:16:28 +08:00
|
|
|
result = resp.json()
|
2026-04-02 11:55:01 +08:00
|
|
|
logger.info(f"img_to_3D 任务处理完成 | task_id: {task_id} | status_code : {status_code} | result: {result}")
|
2026-04-02 11:30:34 +08:00
|
|
|
# 发送到对应的回调接口
|
|
|
|
|
if status_code == 200:
|
|
|
|
|
asyncio.run(
|
|
|
|
|
notify_callback(
|
|
|
|
|
callback_url=callback_url,
|
2026-04-02 11:55:01 +08:00
|
|
|
task_id=task_id,
|
2026-04-02 11:30:34 +08:00
|
|
|
status="completed",
|
|
|
|
|
result=result,
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
else:
|
|
|
|
|
asyncio.run(
|
|
|
|
|
notify_callback(
|
|
|
|
|
callback_url=callback_url,
|
2026-04-02 11:55:01 +08:00
|
|
|
task_id=task_id,
|
2026-04-02 11:30:34 +08:00
|
|
|
status="failed",
|
|
|
|
|
result={},
|
|
|
|
|
)
|
|
|
|
|
)
|
2026-03-31 18:16:28 +08:00
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
except Exception as exc:
|
2026-04-02 11:55:01 +08:00
|
|
|
logger.error(f"img_to_3D 任务失败 | task_id: {task_id} | exc {exc}", exc_info=True)
|
2026-04-02 11:30:34 +08:00
|
|
|
asyncio.run(
|
|
|
|
|
notify_callback(
|
|
|
|
|
callback_url=callback_url,
|
2026-04-02 11:55:01 +08:00
|
|
|
task_id=task_id,
|
2026-04-02 11:30:34 +08:00
|
|
|
status="failed",
|
|
|
|
|
result=result,
|
|
|
|
|
)
|
|
|
|
|
)
|
2026-03-31 18:16:28 +08:00
|
|
|
raise self.retry(exc=exc, countdown=60, max_retries=3)
|
|
|
|
|
|
|
|
|
|
|
2026-04-02 11:30:34 +08:00
|
|
|
@shared_task(bind=True, queue="three_d_to_3views_queue", max_retries=3, name='src.server.canvas_generate_3D.tasks.three_d_to_3views_task')
|
|
|
|
|
def three_d_to_3views_task(self, minio_glb_path: str, callback_url: str):
|
2026-03-31 18:16:28 +08:00
|
|
|
"""3D to 3views 主任务"""
|
2026-04-02 11:55:01 +08:00
|
|
|
task_id = self.request.id
|
|
|
|
|
logger.info(f"开始处理 three_d_to_3views_task | task_id: {task_id}")
|
2026-03-31 18:16:28 +08:00
|
|
|
try:
|
|
|
|
|
input_data = {
|
2026-04-01 11:57:25 +08:00
|
|
|
"minio_glb_path": minio_glb_path,
|
2026-03-31 18:16:28 +08:00
|
|
|
}
|
2026-04-01 11:57:25 +08:00
|
|
|
with httpx.Client(timeout=300.0) as client:
|
2026-03-31 18:16:28 +08:00
|
|
|
resp = client.post(
|
|
|
|
|
f"http://{settings.IMAGE_TO_3D_MODEL_URL}/canvas/3d_to_3views",
|
|
|
|
|
json=input_data
|
|
|
|
|
)
|
2026-04-02 11:30:34 +08:00
|
|
|
status_code = resp.status_code
|
2026-03-31 18:16:28 +08:00
|
|
|
result = resp.json()
|
2026-04-02 11:55:01 +08:00
|
|
|
logger.info(f"three_d_to_3views_task 任务处理完成 | task_id: {task_id} | status_code : {status_code} | result: {result}")
|
2026-04-02 11:30:34 +08:00
|
|
|
# 发送到对应的回调接口
|
|
|
|
|
if status_code == 200:
|
|
|
|
|
asyncio.run(
|
|
|
|
|
notify_callback(
|
|
|
|
|
callback_url=callback_url,
|
2026-04-02 11:55:01 +08:00
|
|
|
task_id=task_id,
|
2026-04-02 11:30:34 +08:00
|
|
|
status="completed",
|
|
|
|
|
result=result,
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
else:
|
|
|
|
|
asyncio.run(
|
|
|
|
|
notify_callback(
|
|
|
|
|
callback_url=callback_url,
|
2026-04-02 11:55:01 +08:00
|
|
|
task_id=task_id,
|
2026-04-02 11:30:34 +08:00
|
|
|
status="failed",
|
|
|
|
|
result={},
|
|
|
|
|
)
|
|
|
|
|
)
|
2026-03-31 18:16:28 +08:00
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
except Exception as exc:
|
2026-04-02 11:55:01 +08:00
|
|
|
logger.error(f"three_d_to_3views_task 任务失败 | task_id: {task_id}", exc_info=True)
|
2026-04-02 11:30:34 +08:00
|
|
|
asyncio.run(
|
|
|
|
|
notify_callback(
|
|
|
|
|
callback_url=callback_url,
|
2026-04-02 11:55:01 +08:00
|
|
|
task_id=task_id,
|
2026-04-02 11:30:34 +08:00
|
|
|
status="failed",
|
|
|
|
|
result={},
|
|
|
|
|
)
|
|
|
|
|
)
|
2026-04-01 11:57:25 +08:00
|
|
|
raise self.retry(exc=exc, countdown=60, max_retries=3)
|