pyproc — Chame Python a partir de Go sem CGO nem microsserviços
(github.com/YuminosukeSato)Eu criei o pyproc para permitir que serviços em Go chamem Python como se fosse uma função local — sem CGO e sem um microsserviço separado. Ele executa um pool de processos worker em Python e se comunica por Unix Domain Sockets no mesmo host/pod, para oferecer baixa sobrecarga, isolamento de processos e paralelismo além do GIL.
Por que isso existe
- Mantenha seu serviço em Go e reutilize Python/NumPy/pandas/PyTorch/scikit-learn.
- Evite saltos de rede, service discovery e a carga operacional de um serviço Python separado.
Teste rápido (~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()
Chamada a partir de 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
}
Escopo / limites
- Apenas mesmo host/pod (UDS). Linux/macOS são suportados; Windows named pipes ainda não.
- Ideal para cargas request/response de ≲ ~100 KB em JSON; orquestração de GPU e serving entre hosts estão fora do escopo.
Benchmarks (indicativos)
- M1 local, JSON simples: ~45µs p50 e ~200 mil req/s com 8 workers. Seus números podem variar.
O que está incluído
- Cliente em Go puro (sem CGO), biblioteca worker em Python, pool, health checks, reinícios graciosos e exemplos.
Docs & código
- README, docs de design/ops/segurança, pkg.go.dev: https://github.com/YuminosukeSato/pyproc
Licença
- Apache-2.0. Versão atual: v0.2.x.
Feedback é bem-vindo
- Ergonomia da API, modos de falha sob carga e prioridades para codecs/transports (por exemplo, Arrow IPC, gRPC-over-UDS).
Ainda não há comentários.