数据截至 (上游 commit 5c995c365dfb)
部署层与远程协议
本章讲"在哪跑"这一层。核心洞察:所有远程后端做的是同一件事——把上一章那个
LocalRuntime用 HTTP 包起来跑到目标机器上,再从本地连过去。理解了这个模板,docker / modal / fargate 就只是"怎么把进程拉起来"的不同实现。
1. 部署接口:start / stop / runtime
AbstractDeployment(deployment/abstract.py:11)的契约很小:
| 成员 | 作用 |
|---|---|
start() | 把运行时拉起来(起容器、跑 server) |
stop() | 关掉 |
is_alive() | 健康检查 |
runtime(属性) | 返回一个可用的 AbstractRuntime |
add_hook() | 注册进度回调 |
注意一个细节:__del__ 里会尝试在对象被回收时自动 stop()(deployment/abstract.py:44-60),处理了"用户忘了关容器"导致资源泄漏的常见情况——它还小心地区分了"当前是否在 async 事件循环里"。
2. 统一模板:server 包住 LocalRuntime,RemoteRuntime 连回来
这 是全章的钥匙。远程执行 = 远端跑 server + 本地跑 client。
远端:server.py 是 LocalRuntime 的 HTTP 镜像
server.py 是个 FastAPI 应用,模块级就 runtime = LocalRuntime()(server.py:31-32)。它的每个路由几乎就是接口方法的直译:
| HTTP 路由 | 转发到 | 源码 |
|---|---|---|
POST /create_session | runtime.create_session | server.py:132-134 |
POST /run_in_session | runtime.run_in_session | server.py:137-139 |
POST /execute | runtime.execute | server.py:147-149 |
GET /is_alive | runtime.is_alive | server.py:127-129 |
它由 swerex-remote 这个命令行入口启动(pyproject.toml 的 [project.scripts] 把 swerex-remote 映射到 swerex.server:main),main() 解析 --host/--port/--auth-token 后 uvicorn.run(server.py:193-217)。