From 0b4e10209a5019d5604dd94962686d424fef16f6 Mon Sep 17 00:00:00 2001 From: admin <572701190@qq.com> Date: Sun, 3 May 2026 17:30:24 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=8B=86=E5=B8=A7=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E8=BF=9B=E5=BA=A6=E5=8D=A1=E5=9C=A8=200%?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 Celery worker 启动方式改为 solo pool,避免 OpenCV/PyTorch/SAM 相关依赖在本机 prefork worker 中段错误崩溃。 - 增强开发重启脚本:启动 Celery 后检查 worker 进程是否持续存活,避免脚本误报服务已启动但任务无人消费。 - 同步一键启动脚本和安装/README 文档中的 Celery 启动命令,统一使用 --pool=solo --concurrency=1。 - 已验证脚本语法、diff 检查、服务重启、健康检查和 Celery inspect ping,确认拆帧任务可从 0% 继续执行到完成。 --- README.md | 6 +++--- doc/10-installation.md | 6 +++--- restart_dev_services.sh | 24 +++++++++++++++++++++++- start_services.sh | 2 +- 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index ed747dc..b91f32f 100644 --- a/README.md +++ b/README.md @@ -334,10 +334,10 @@ nohup uvicorn main:app --host 0.0.0.0 --port 8000 > /tmp/fastapi.log 2>&1 & cd ~/Desktop/Seg_Server/backend source ~/miniconda3/etc/profile.d/conda.sh conda activate seg_server -celery -A celery_app:celery_app worker --loglevel=info --concurrency=1 +celery -A celery_app:celery_app worker --loglevel=info --pool=solo --concurrency=1 # 或使用后台模式 -nohup celery -A celery_app:celery_app worker --loglevel=info --concurrency=1 > /tmp/celery.log 2>&1 & +nohup celery -A celery_app:celery_app worker --loglevel=info --pool=solo --concurrency=1 > /tmp/celery.log 2>&1 & ``` 视频导入只创建项目并把源视频保存到 MinIO,不会自动拆帧;项目库导入面板会用 Axios 上传回调显示上传进度、百分比和字节数。用户在项目库点击“生成帧”后,再选择目标 FPS 并调用 `POST /api/media/parse`。DICOM 批量导入会在前端选择、后端上传、worker 下载和 pydicom 读取四个环节按文件名自然顺序排序,保证 `1.dcm、2.dcm、10.dcm` 这种序列按可见数字顺序转成项目帧;上传阶段同样显示进度条和本次有效 `.dcm` 文件数量,上传完成后项目库会轮询解析任务进度直到完成、失败或取消。项目卡片支持复制项目:`新项目重置` 会复制项目媒体字段和已生成帧序列但不复制标注,`全内容复制` 会额外复制标注和关联 mask 元数据,任务运行历史不复制。项目库和模板库的成功/失败反馈使用非阻塞短提示,会自动消失,不再用浏览器 `alert()` 阻塞后续操作;项目删除、模板删除、用户改密码/删除和演示出厂重置等高风险操作使用站内确认弹窗。该接口只创建 `processing_tasks` 记录并把任务投递给 Celery;真正的 FFmpeg/OpenCV/pydicom 拆帧由 worker 执行。接口支持 `parse_fps`、`max_frames` 和 `target_width`,用于生成后续 SAM 2 视频处理可复用的标准帧序列;视频/DICOM 解析后都按 `frame_%06d.jpg` 连续生成项目帧,帧表会记录 `timestamp_ms` 和 `source_frame_number`,任务完成结果会返回 `frame_sequence` 元数据。worker 每次更新任务状态后会发布到 Redis `seg:progress` 频道,FastAPI 订阅后转发到 `/ws/progress`,前端 Dashboard 可实时更新。Dashboard 的任务进度区展示 queued/running/success/failed/cancelled 最近任务,处理中统计只计算 queued/running;WebSocket 状态由浏览器 `onopen/onclose/onerror` 驱动,客户端会定时发送 `ping` 心跳,服务端返回 `status` 确认连接。Dashboard 也可调用 `/api/tasks/{id}/cancel`、`/api/tasks/{id}/retry` 和 `/api/tasks/{id}` 完成任务取消、重试与失败详情查看。 @@ -446,7 +446,7 @@ pip install -r requirements-dev.txt # 安装后端测试 pytest tests # 后端接口测试 uvicorn main:app --host 0.0.0.0 --port 8000 --reload # 开发模式(热重载) uvicorn main:app --host 0.0.0.0 --port 8000 # 生产模式 -celery -A celery_app:celery_app worker --loglevel=info --concurrency=1 # 后台任务 worker +celery -A celery_app:celery_app worker --loglevel=info --pool=solo --concurrency=1 # 后台任务 worker ``` --- diff --git a/doc/10-installation.md b/doc/10-installation.md index 4cdc643..1f7f6f7 100644 --- a/doc/10-installation.md +++ b/doc/10-installation.md @@ -279,7 +279,7 @@ uvicorn main:app --host 0.0.0.0 --port 8000 --reload ```bash conda activate seg_server cd /home/wkmgc/Desktop/Seg_Server/backend -celery -A celery_app:celery_app worker --loglevel=info --concurrency=1 +celery -A celery_app:celery_app worker --loglevel=info --pool=solo --concurrency=1 ``` 终端 C:前端开发服务 @@ -391,7 +391,7 @@ pkill -f "npm run dev" || true cd /home/wkmgc/Desktop/Seg_Server/backend setsid ~/miniconda3/bin/conda run -n seg_server uvicorn main:app --host 0.0.0.0 --port 8000 \ > /tmp/seg_server_fastapi.log 2>&1 < /dev/null & -setsid ~/miniconda3/bin/conda run -n seg_server celery -A celery_app:celery_app worker --loglevel=info --concurrency=1 \ +setsid ~/miniconda3/bin/conda run -n seg_server celery -A celery_app:celery_app worker --loglevel=info --pool=solo --concurrency=1 \ > /tmp/seg_server_celery.log 2>&1 < /dev/null & # 启动前端 @@ -434,7 +434,7 @@ Celery worker 仍需要单独启动: ```bash cd backend -celery -A celery_app:celery_app worker --loglevel=info --concurrency=1 +celery -A celery_app:celery_app worker --loglevel=info --pool=solo --concurrency=1 ``` 实际生产建议用 systemd、supervisor 或容器编排托管 FastAPI、Celery、前端静态服务、MinIO、Redis、PostgreSQL。 diff --git a/restart_dev_services.sh b/restart_dev_services.sh index a9af878..5062967 100755 --- a/restart_dev_services.sh +++ b/restart_dev_services.sh @@ -98,6 +98,27 @@ wait_for_http() { exit 1 } +wait_for_process() { + local label="$1" + local pidfile="$2" + local logfile="$3" + + for _ in $(seq 1 8); do + local pid + pid="$(cat "${pidfile}" 2>/dev/null || true)" + if [[ -n "${pid}" ]] && kill -0 "${pid}" >/dev/null 2>&1; then + echo " ${label} ready" + return + fi + sleep 1 + done + + echo "${label} did not stay running." >&2 + echo "Last log lines from ${logfile}:" >&2 + tail -n 80 "${logfile}" >&2 || true + exit 1 +} + ensure_conda echo "[1/6] Checking PostgreSQL..." @@ -138,12 +159,13 @@ echo "[5/6] Starting backend and worker..." start_detached "FastAPI" "${PROJECT_DIR}/backend" "${FASTAPI_PID}" "${FASTAPI_LOG}" \ "${CONDA_BIN}" run -n "${CONDA_ENV}" uvicorn main:app --host 0.0.0.0 --port "${BACKEND_PORT}" start_detached "Celery" "${PROJECT_DIR}/backend" "${CELERY_PID}" "${CELERY_LOG}" \ - "${CONDA_BIN}" run -n "${CONDA_ENV}" celery -A celery_app:celery_app worker --loglevel=info --concurrency=1 + "${CONDA_BIN}" run -n "${CONDA_ENV}" celery -A celery_app:celery_app worker --loglevel=info --pool=solo --concurrency=1 echo "[6/6] Starting frontend..." start_detached "Frontend" "${PROJECT_DIR}" "${FRONTEND_PID}" "${FRONTEND_LOG}" npm run dev wait_for_http "FastAPI" "http://127.0.0.1:${BACKEND_PORT}/health" "${FASTAPI_LOG}" +wait_for_process "Celery" "${CELERY_PID}" "${CELERY_LOG}" wait_for_http "Frontend" "http://127.0.0.1:${FRONTEND_PORT}" "${FRONTEND_LOG}" HEAD echo "== Restart complete ==" diff --git a/start_services.sh b/start_services.sh index 1f76e28..262b41e 100755 --- a/start_services.sh +++ b/start_services.sh @@ -47,7 +47,7 @@ echo " ✓ FastAPI 已启动 (http://localhost:8000/docs)" # 5. 启动 Celery Worker echo "[5/6] 启动 Celery Worker..." cd "$PROJECT_DIR/backend" -nohup celery -A celery_app:celery_app worker --loglevel=info --concurrency=1 > /tmp/celery.log 2>&1 & +nohup celery -A celery_app:celery_app worker --loglevel=info --pool=solo --concurrency=1 > /tmp/celery.log 2>&1 & sleep 2 echo " ✓ Celery Worker 已启动"