pyproc — appeler Python depuis Go sans CGO ni microservices
(github.com/YuminosukeSato)J’ai créé pyproc pour permettre aux services Go d’appeler Python comme une fonction locale — sans CGO et sans microservice séparé. Il exécute un pool de processus workers Python et communique via des sockets de domaine Unix sur le même hôte/pod, ce qui offre une faible surcharge, une isolation des processus et du parallélisme au-delà du GIL.
Pourquoi cela existe
- Conserver votre service Go tout en réutilisant Python/NumPy/pandas/PyTorch/scikit-learn.
- Éviter les sauts réseau, la découverte de services et la charge opérationnelle d’un service Python séparé.
Essai rapide (~5 minutes)
Go (app) :
go get github.com/YuminosukeSato/pyproc@latest
Python (worker) :
pip install pyproc-worker
Worker minimal (Python) :
from pyproc_worker import expose, run_worker
@expose
def predict(req):
return {"result": req["value"] * 2}
if __name__ == "__main__":
run_worker()
Appel depuis 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
}
Portée / limites
- Même hôte/pod uniquement (UDS). Linux/macOS pris en charge ; les named pipes Windows ne le sont pas encore.
- Idéal pour des charges utiles de type requête/réponse en JSON ≲ ~100 KB ; l’orchestration GPU et le serving inter-hôtes sont hors périmètre.
Benchmarks (à titre indicatif)
- Sur un M1 local, JSON simple : ~45µs p50 et ~200k req/s avec 8 workers. Vos résultats peuvent varier.
Ce qui est inclus
- Client Go pur (sans CGO), bibliothèque worker Python, pool, vérifications d’état, redémarrages propres et exemples.
Documentation & code
- README, documentation de conception/opérations/sécurité, pkg.go.dev : https://github.com/YuminosukeSato/pyproc
Licence
- Apache-2.0. Version actuelle : v0.2.x.
Retours bienvenus
- Ergonomie de l’API, modes de défaillance sous charge et priorités pour les codecs/transports (par ex. Arrow IPC, gRPC-over-UDS).
Aucun commentaire pour le moment.