pyproc — เรียก Python จาก Go ได้โดยไม่ต้องใช้ CGO หรือ microservices
(github.com/YuminosukeSato)ผมสร้าง pyproc ขึ้นมาเพื่อให้บริการ Go สามารถเรียก Python ได้เหมือนเป็นฟังก์ชันภายในเครื่อง — ไม่ต้องใช้ CGO และไม่ต้องแยกเป็น microservice มันรันพูลของโปรเซส worker ฝั่ง Python และสื่อสารกันผ่าน Unix Domain Sockets บนโฮสต์/พ็อดเดียวกัน จึงได้ทั้งโอเวอร์เฮดต่ำ การแยกโปรเซส และการทำงานขนานที่ไปได้ไกลกว่าข้อจำกัดของ GIL
ทำไมถึงมีสิ่งนี้
- คงบริการ Go ของคุณไว้ พร้อมนำ Python/NumPy/pandas/PyTorch/scikit-learn กลับมาใช้ซ้ำได้
- หลีกเลี่ยงการวิ่งข้ามเครือข่าย, service discovery และภาระด้าน ops ของการแยกบริการ Python ออกมาต่างหาก
ทดลองแบบเร็ว (~5 นาที)
Go (แอป):
go get github.com/YuminosukeSato/pyproc@latest
Python (worker):
pip install pyproc-worker
worker แบบขั้นต่ำ (Python):
from pyproc_worker import expose, run_worker
@expose
def predict(req):
return {"result": req["value"] * 2}
if __name__ == "__main__":
run_worker()
เรียกจาก 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
}
ขอบเขต / ข้อจำกัด
- ใช้ได้เฉพาะบนโฮสต์/พ็อดเดียวกันเท่านั้น (UDS) รองรับ Linux/macOS; ยังไม่รองรับ Windows named pipes
- เหมาะที่สุดกับ payload แบบ request/response ขนาด ≲ ~100 KB JSON; การ orchestration ของ GPU และการเสิร์ฟข้ามโฮสต์อยู่นอกขอบเขต
เบนช์มาร์ก (เพื่ออ้างอิงคร่าว ๆ)
- บน M1 ในเครื่อง, JSON แบบง่าย: ~45µs p50 และ ~200k req/s เมื่อใช้ worker 8 ตัว ตัวเลขจริงของคุณอาจแตกต่างออกไป
สิ่งที่มีมาให้
- ไคลเอนต์ Pure Go (ไม่ใช้ CGO), ไลบรารี worker ฝั่ง Python, พูล, health checks, graceful restarts และตัวอย่างการใช้งาน
เอกสารและโค้ด
- README, เอกสาร design/ops/security, pkg.go.dev: https://github.com/YuminosukeSato/pyproc
ไลเซนส์
- Apache-2.0 รุ่นที่ปล่อยปัจจุบัน: v0.2.x
ยินดีรับฟีดแบ็ก
- ความลื่นไหลในการใช้งาน API, รูปแบบความล้มเหลวภายใต้โหลด และลำดับความสำคัญของ codecs/transports (เช่น Arrow IPC, gRPC-over-UDS)
ยังไม่มีความคิดเห็น