pyproc — Python aus Go aufrufen, ohne CGO oder Microservices
(github.com/YuminosukeSato)Ich habe pyproc entwickelt, damit Go-Services Python wie eine lokale Funktion aufrufen können — ohne CGO und ohne separaten Microservice. Es betreibt einen Pool von Python-Worker-Prozessen und kommuniziert über Unix-Domain-Sockets auf demselben Host/Pod. So erhält man geringen Overhead, Prozessisolierung und Parallelität jenseits der GIL.
Warum es das gibt
- Behalte deinen Go-Service und nutze trotzdem Python/NumPy/pandas/PyTorch/scikit-learn weiter.
- Vermeide Netzwerksprünge, Service Discovery und den operativen Aufwand eines separaten Python-Services.
Schnell ausprobieren (ca. 5 Minuten)
Go (App):
go get github.com/YuminosukeSato/pyproc@latest
Python (Worker):
pip install pyproc-worker
Minimaler Worker (Python):
from pyproc_worker import expose, run_worker
@expose
def predict(req):
return {"result": req["value"] * 2}
if __name__ == "__main__":
run_worker()
Aufruf aus 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
}
Umfang / Grenzen
- Nur gleicher Host/Pod (UDS). Linux/macOS werden unterstützt; Windows Named Pipes noch nicht.
- Am besten geeignet für Request/Response-Payloads bis etwa ≲ ~100 KB JSON; GPU-Orchestrierung und Serving über Host-Grenzen hinweg sind nicht vorgesehen.
Benchmarks (zur Orientierung)
- Lokal auf einem M1, einfaches JSON: ~45µs p50 und ~200k Req/s mit 8 Workern. Deine Werte können abweichen.
Was enthalten ist
- Reiner Go-Client (ohne CGO), Python-Worker-Bibliothek, Pool, Health Checks, Graceful Restarts und Beispiele.
Doku & Code
- README, Design-/Ops-/Sicherheitsdokumentation, pkg.go.dev: https://github.com/YuminosukeSato/pyproc
Lizenz
- Apache-2.0. Aktuelle Version: v0.2.x.
Feedback willkommen
- API-Ergonomie, Fehlermodi unter Last und Prioritäten für Codecs/Transporte (z. B. Arrow IPC, gRPC-over-UDS).
Noch keine Kommentare.