pyproc — Memanggil Python dari Go tanpa CGO atau microservice
(github.com/YuminosukeSato)Saya membuat pyproc agar layanan Go dapat memanggil Python seperti fungsi lokal — tanpa CGO dan tanpa microservice terpisah. Ia menjalankan sekumpulan proses worker Python dan berkomunikasi melalui Unix Domain Sockets pada host/pod yang sama, sehingga Anda mendapatkan overhead rendah, isolasi proses, dan paralelisme melampaui GIL.
Mengapa ini ada
- Pertahankan layanan Go Anda, gunakan kembali Python/NumPy/pandas/PyTorch/scikit-learn.
- Hindari network hop, service discovery, dan beban operasional dari layanan Python terpisah.
Coba cepat (~5 menit)
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()
Panggil dari 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
}
Cakupan / batasan
- Hanya host/pod yang sama (UDS). Linux/macOS didukung; named pipes Windows belum tersedia.
- Paling cocok untuk payload request/response JSON ≲ ~100 KB; orkestrasi GPU dan serving lintas host berada di luar cakupan.
Benchmark (indikatif)
- M1 lokal, JSON sederhana: ~45µs p50 dan ~200k req/s dengan 8 worker. Hasil Anda bisa berbeda.
Yang disertakan
- Client Go murni (tanpa CGO), library worker Python, pool, health check, graceful restart, dan contoh.
Dokumentasi & kode
- README, dokumen desain/operasional/keamanan, pkg.go.dev: https://github.com/YuminosukeSato/pyproc
Lisensi
- Apache-2.0. Rilis saat ini: v0.2.x.
Masukan diterima
- Ergonomi API, failure mode saat beban tinggi, dan prioritas untuk codec/transport (misalnya Arrow IPC, gRPC-over-UDS).
Belum ada komentar.