pyproc — Llama a Python desde Go sin CGO ni microservicios
(github.com/YuminosukeSato)Construí pyproc para permitir que los servicios en Go llamen a Python como si fuera una función local: sin CGO y sin un microservicio separado. Ejecuta un pool de procesos worker de Python y se comunica por Unix Domain Sockets en el mismo host/pod, así que obtienes baja sobrecarga, aislamiento por proceso y paralelismo más allá del GIL.
Por qué existe
- Mantén tu servicio en Go y reutiliza Python/NumPy/pandas/PyTorch/scikit-learn.
- Evita saltos de red, service discovery y la carga operativa de un servicio de Python separado.
Prueba rápida (~5 minutos)
Go (app):
go get github.com/YuminosukeSato/pyproc@latest
Python (worker):
pip install pyproc-worker
Worker mínimo (Python):
from pyproc_worker import expose, run_worker
@expose
def predict(req):
return {"result": req["value"] * 2}
if __name__ == "__main__":
run_worker()
Llamada desde Go:
import (
"context"
"fmt"
"github.com/YuminosukeSato/pyproc/pkg/pyproc"
)
func main() {
pool, _ := pyproc.NewPool(pyproc.PoolOptions{
Config: pyproc.PoolConfig{Workers: 4, MaxInFlight: 10},
WorkerConfig: pyproc.WorkerConfig{SocketPath: "/tmp/pyproc.sock", PythonExec: "python3", WorkerScript: "worker.py"},
}, nil)
_ = pool.Start(context.Background())
defer pool.Shutdown(context.Background())
var out map[string]any
_ = pool.Call(context.Background(), "predict", map[string]any{"value": 42}, &out)
fmt.Println(out["result"]) // 84
}
Alcance / límites
- Solo para el mismo host/pod (UDS). Compatible con Linux/macOS; Windows con named pipes todavía no.
- Ideal para payloads de request/response de ≲ ~100 KB JSON; la orquestación de GPU y el serving entre hosts quedan fuera del alcance.
Benchmarks (orientativos)
- M1 local, JSON simple: ~45µs p50 y ~200k req/s con 8 workers. Tus resultados pueden variar.
Qué incluye
- Cliente puro en Go (sin CGO), librería de workers en Python, pool, health checks, reinicios elegantes y ejemplos.
Docs y código
- README, documentación de diseño/ops/seguridad, pkg.go.dev: https://github.com/YuminosukeSato/pyproc
Licencia
- Apache-2.0. Versión actual: v0.2.x.
Se agradece feedback
- Ergonomía de la API, modos de falla bajo carga y prioridades para codecs/transports (p. ej., Arrow IPC, gRPC-over-UDS).
Aún no hay comentarios.