- #go
- #concurrency
- #worker-pool
- #context
Mẫu đồng thời Go: context, errgroup, worker pool và ngăn rò rỉ goroutineGo concurrency: context, errgroup, worker pool, and avoiding goroutine leaks
Hướng dẫn thực tế dùng context, errgroup và worker‑pool để tránh rò rỉ goroutine trong Go production.Practical guide to using context, errgroup and a worker‑pool to prevent goroutine leaks in Go production.
Mục lụcContents· 8
Bạn có bao giờ chạy một service Go xử lý hàng nghìn yêu cầu đồng thời và cuối cùng nhận được cảnh báo “goroutine leak” trong log? Ngay cả khi bạn đã dùng context để hủy, một vài goroutine vẫn còn treo, tiêu tốn bộ nhớ và kết nối DB. Bài viết này sẽ chỉ cho bạn cách dùng context, errgroup và một worker‑pool an toàn, đồng thời phát hiện và ngăn chặn rò rỉ goroutine trong môi trường production.
Context và việc hủy chuỗi#
context.Context là công cụ chuẩn để truyền deadline, cancel signal và giá trị request‑scoped giữa các hàm. Khi một HTTP request bị client hủy, server nhận được ctx.Done() và có thể dừng công việc đang chạy. Tuy nhiên, chỉ truyền ctx chưa đủ; mọi goroutine con phải luôn kiểm tra ctx.Done() và trả về nhanh chóng.
Ví dụ cơ bản#
func doWork(ctx context.Context) error {
select {
case <-time.After(5 * time.Second):
// công việc dài
return nil
case <-ctx.Done():
// client đã hủy
return ctx.Err()
}
}