开始多平台 多店铺整改
This commit is contained in:
@@ -5,12 +5,19 @@
|
||||
只保留最核心的能力:
|
||||
|
||||
- 加载 `ddddocr`
|
||||
- 从标准输入接收 JSON 行
|
||||
- 返回识别结果 JSON 行
|
||||
- 接收一次 OCR 请求并返回一次 JSON 结果
|
||||
- 提供一个最小化健康检查入口
|
||||
|
||||
初始化依赖:
|
||||
|
||||
```bash
|
||||
cd /Users/yml/codes/order-site-backend/subservices/ocr-worker
|
||||
cd /Users/yml/codes/order-site-workspace/apps/backend/subservices/ocr-worker
|
||||
uv sync
|
||||
```
|
||||
|
||||
说明:
|
||||
|
||||
- 本地源码调试时,先执行 `uv sync`
|
||||
- Docker 镜像构建时,会把 OCR 依赖直接安装到容器内的 Python 环境
|
||||
- Docker 运行时只使用容器内 `python3`
|
||||
- 后端现在按次调用 OCR Python 进程,不再维护常驻 worker
|
||||
|
||||
@@ -13,11 +13,20 @@ from .engine import get_ocr_engine, recognize_image
|
||||
|
||||
def main() -> None:
|
||||
parser = argparse.ArgumentParser(prog="ocr-worker", description="本地 OCR worker")
|
||||
parser.add_argument("command", nargs="?", default="worker", choices=["worker"])
|
||||
parser.add_argument(
|
||||
"command",
|
||||
nargs="?",
|
||||
default="request",
|
||||
choices=["worker", "request", "healthcheck"],
|
||||
)
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.command == "worker":
|
||||
run_worker()
|
||||
elif args.command == "request":
|
||||
run_single_request()
|
||||
elif args.command == "healthcheck":
|
||||
run_healthcheck()
|
||||
|
||||
|
||||
def run_worker() -> None:
|
||||
@@ -56,6 +65,35 @@ def run_worker() -> None:
|
||||
)
|
||||
|
||||
|
||||
def run_single_request() -> None:
|
||||
get_ocr_engine()
|
||||
raw_text = sys.stdin.read().strip()
|
||||
|
||||
if not raw_text:
|
||||
raise ValueError("缺少 OCR 请求内容")
|
||||
|
||||
try:
|
||||
request = json.loads(raw_text)
|
||||
action = str(request.get("action") or "recognize").strip().lower()
|
||||
payload = request.get("payload") or {}
|
||||
|
||||
if action == "recognize":
|
||||
response_payload = build_success_payload(recognize_payload(payload), "ok")
|
||||
elif action == "batch":
|
||||
response_payload = build_success_payload(batch_recognize_payload(payload), "ok")
|
||||
else:
|
||||
response_payload = build_error_payload(f"不支持的 action: {action}")
|
||||
except Exception as error: # noqa: BLE001
|
||||
response_payload = build_error_payload(str(error) or "请求失败")
|
||||
|
||||
write_message(response_payload)
|
||||
|
||||
|
||||
def run_healthcheck() -> None:
|
||||
get_ocr_engine()
|
||||
write_message({"code": 0, "msg": "ok"})
|
||||
|
||||
|
||||
def recognize_payload(payload: Any) -> dict[str, Any]:
|
||||
if not isinstance(payload, dict):
|
||||
raise ValueError("payload 必须是对象")
|
||||
@@ -177,3 +215,7 @@ def build_timestamp() -> str:
|
||||
def write_message(payload: dict[str, Any]) -> None:
|
||||
sys.stdout.write(json.dumps(payload, ensure_ascii=False) + "\n")
|
||||
sys.stdout.flush()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
Reference in New Issue
Block a user