3 points par merumeru 2025-09-16 | Aucun commentaire pour le moment. | Partager sur WhatsApp

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

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.

Aucun commentaire pour le moment.