pyproc - 无需 CGO 或微服务即可从 Go 调用 Python
pyproc 允许你从 Go 调用 Python 函数,就像它们是本地函数一样,使用:
- 零网络开销 - 使用 Unix 域套接字进行 IPC
- 进程隔离 - Python 崩溃不会影响你的 Go 服务
- 真正的并行性- 多个 Python 进程绕过 GIL
- 简单部署 - 只需 Go 二进制文件 + Python 脚本
- 连接池 - 重用连接以实现高吞吐量
目标受众和用例
非常适合需要执行以下操作的团队:
- 将现有的 Python ML 模型(PyTorch、TensorFlow、scikit-learn)集成到 Go 服务中
- 使用 Go 应用程序中的 Python 库(pandas、numpy)处理数据
- 处理 1-5k RPS,JSON 有效负载低于 100KB
- 部署在同一主机/pod上,无需担心网络复杂性
- 在保留 Python 逻辑的同时,逐步从 Python 微服务迁移到 Go
理想的部署场景:
- Kubernetes 同 Pod 部署,具有 UDS 共享卷
- 具有共享套接字卷的 Docker 容器
- Linux/macOS 上的传统服务器部署
非目标
pyproc不适用于:
- 跨主机通信- 使用 gRPC/REST API 实现分布式系统
- Windows UDS 支持- 不支持 Windows 命名管道
- GPU 管理- 使用专用 ML 服务框架(TensorRT、Triton)
- 大规模 ML 服务- 考虑使用 Ray Serve、MLflow 或 KServe 进行企业 ML
- 实时流- 使用 Apache Kafka 或类似产品实现高吞吐量流
- 数据库操作- 直接使用原生 Go 数据库驱动程序
Compatibility Matrix
| Component | Requirements |
|---|---|
| Operating System | Linux, macOS (Unix Domain Sockets required) |
| Go 版本 | 1.22+ |
| Python 版本 | 3.9+ (建议 3.12) |
| Deployment | Same host/pod only |
| Container Runtime | Docker, containerd, any OCI-compatible |
| Orchestration | Kubernetes (same-pod), Docker Compose, systemd |
| Architecture | amd64, arm64 |
特点
- 无需 CGO - 使用 Unix 域套接字的纯 Go 实现
- 绕过 Python GIL - 并行运行多个 Python 进程
- 类似函数的 API - 调用 Python 函数就像
pool.Call(ctx, "predict", input, &output) - 最小开销- 45μs p50 延迟,8 个 worker 每秒 200,000+ 个请求
- 生产就绪——健康检查、正常关机、自动重启
- 易于部署- 单个二进制文件 + Python 脚本,无需服务网格