ผมสร้าง 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 และตัวอย่างการใช้งาน

เอกสารและโค้ด

ไลเซนส์

  • Apache-2.0 รุ่นที่ปล่อยปัจจุบัน: v0.2.x

ยินดีรับฟีดแบ็ก

  • ความลื่นไหลในการใช้งาน API, รูปแบบความล้มเหลวภายใต้โหลด และลำดับความสำคัญของ codecs/transports (เช่น Arrow IPC, gRPC-over-UDS)

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น