解决极速成片问题

This commit is contained in:
Azmat@qq.com
2026-08-26 09:19:53 +08:00
parent 43d0b088e4
commit 245525ec53
7 changed files with 114 additions and 8 deletions
@@ -423,15 +423,23 @@ def _advance_script(job: QuickCreateJob) -> int | None:
if not metadata.get("script_started"):
from apps.projects.tasks import run_quick_script_task
from apps.common.celery_health import worker_consumes_queue
metadata["script_started"] = True
metadata["script_started_at"] = timezone.now().isoformat()
listens = worker_consumes_queue("airshelf.quick")
if listens is False:
metadata["script_local"] = True
_save_job(
job,
metadata=metadata,
progress=28,
message="正在根据商品名称与图片生成带货脚本",
)
run_quick_script_task.apply_async(args=[str(job.id)], queue="airshelf.quick")
if listens is False:
_run_quick_script_in_thread(str(job.id))
else:
run_quick_script_task.apply_async(args=[str(job.id)], queue="airshelf.quick")
return SCRIPT_POLL_SECONDS
latest = _latest_script_task(job.project)
@@ -946,12 +954,26 @@ def _run_quick_script_in_thread(job_id: str) -> None:
def _enqueue_advance(job: QuickCreateJob) -> None:
from apps.common.celery_health import worker_consumes_queue
from apps.projects.tasks import advance_quick_create_task
job_id = str(job.id)
if worker_consumes_queue("airshelf.quick") is False:
_advance_without_quick_queue(job_id)
return
try:
advance_quick_create_task.apply_async(args=[job_id], queue="airshelf.quick")
except Exception: # noqa: BLE001 — 队列不可用时就地推进一步
_advance_without_quick_queue(job_id)
def _advance_without_quick_queue(job_id: str) -> None:
"""部署后的 worker 若只听 celery 队列,airshelf.quick 里的任务会永远没人拿。"""
delay = advance_quick_create(job_id)
job = QuickCreateJob.objects.filter(id=job_id).first()
if job is None or delay is None:
return
if job.phase == QuickCreateJob.Phase.SCRIPT and not (job.metadata or {}).get("script_started"):
advance_quick_create(job_id)
@@ -1028,6 +1050,13 @@ def recover_quick_create(job: QuickCreateJob) -> None:
return
if _is_finished(job):
return
if job.status == QuickCreateJob.Status.QUEUED or job.phase == QuickCreateJob.Phase.PRODUCT:
if timezone.now() - job.updated_at > STALE_AFTER:
try:
_advance_without_quick_queue(str(job.id))
except Exception: # noqa: BLE001 — 恢复失败不能把进度接口打成 500
logger.exception("quick create recover advance failed for job %s", job.id)
return
job_id = str(job.id)
metadata = dict(job.metadata or {})
if job.phase == QuickCreateJob.Phase.SCRIPT and metadata.get("script_started"):