pyproc — Gọi Python từ Go mà không cần CGO hay microservice
(github.com/YuminosukeSato)Tôi đã tạo ra pyproc để các dịch vụ Go có thể gọi Python như một hàm cục bộ — không cần CGO và không cần microservice riêng. Nó chạy một nhóm tiến trình worker Python và giao tiếp qua Unix Domain Sockets trên cùng host/pod, nhờ đó có chi phí thấp, cách ly tiến trình và khả năng xử lý song song vượt ra ngoài GIL.
Vì sao dự án này tồn tại
- Giữ nguyên dịch vụ Go của bạn, đồng thời tái sử dụng Python/NumPy/pandas/PyTorch/scikit-learn.
- Tránh các bước nhảy mạng, service discovery và gánh nặng vận hành của một dịch vụ Python riêng biệt.
Dùng thử nhanh (~5 phút)
Go (ứng dụng):
go get github.com/YuminosukeSato/pyproc@latest
Python (worker):
pip install pyproc-worker
Worker tối giản (Python):
from pyproc_worker import expose, run_worker
@expose
def predict(req):
return {"result": req["value"] * 2}
if __name__ == "__main__":
run_worker()
Gọi từ 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
}
Phạm vi / giới hạn
- Chỉ hỗ trợ cùng host/pod (UDS). Hỗ trợ Linux/macOS; chưa hỗ trợ named pipes trên Windows.
- Phù hợp nhất cho payload request/response JSON cỡ ≲ ~100 KB; điều phối GPU và phục vụ đa host nằm ngoài phạm vi.
Benchmark (mang tính tham khảo)
- Trên máy M1 cục bộ, JSON đơn giản: ~45µs p50 và ~200k req/s với 8 worker. Kết quả thực tế có thể khác.
Bao gồm những gì
- Client thuần Go (không CGO), thư viện worker Python, pool, health check, graceful restart và các ví dụ.
Tài liệu & mã nguồn
- README, tài liệu thiết kế/vận hành/bảo mật, pkg.go.dev: https://github.com/YuminosukeSato/pyproc
Giấy phép
- Apache-2.0. Bản phát hành hiện tại: v0.2.x.
Mong nhận phản hồi
- Trải nghiệm API, các chế độ lỗi khi chịu tải và mức độ ưu tiên cho codec/transport (ví dụ: Arrow IPC, gRPC-over-UDS).
Chưa có bình luận nào.