WaitGroup
🚦 1. WaitGroup
là gì?
WaitGroup
là gì?sync.WaitGroup
là một công cụ đồng bộ hoá trong Go, giúp đợi cho một nhóm goroutine hoàn thành công việc trước khi tiếp tục.
Cực kỳ hữu ích khi bạn fire nhiều goroutine song song và cần biết khi nào tất cả xong.
🛠 2. Cách dùng cơ bản
Ghi nhớ:
Add(n)
= báo là cón
công việc sẽ đếnDone()
= báo là 1 công việc đã xongWait()
= block cho đến khi counter về 0
⚠️ 3. Lỗi thường gặp
❌ Quên Done()
→ Deadlock
Done()
→ Deadlock❌ Gọi Add()
sau khi Wait()
đã bắt đầu
Add()
sau khi Wait()
đã bắt đầuKhông thread-safe nếu gọi Add()
sau khi Wait()
đang chạy → race condition
✅ Cách đúng: Gọi toàn bộ Add()
trước khi gọi Wait()
.
🧠 4. Sử dụng WaitGroup kết hợp với xử lý lỗi (pattern hay dùng)
Bạn có thể kết hợp với channel để collect error:
📦 5. Best Practices từ Senior Dev
✅ Dùng defer wg.Done()
ngay đầu goroutine
Để tránh quên gọi Done()
khi panic
✅ Gọi Add(n)
trước khi chạy goroutines
Đảm bảo tính nhất quán
🚫 Không gọi Wait()
trong goroutine
Có thể gây deadlock nếu không cẩn thận
✅ Dùng sync.Once
kết hợp khi cần chỉ gọi 1 lần
Trong trường hợp cần shutdown, hoặc init
🧪 6. Use-case thực tế (API Parallel Requests)
Ví dụ gọi song song nhiều API và chờ tất cả hoàn thành:
🚀 7. Bonus: Tự wrap WaitGroup thành TaskPool
Nếu bạn thích code gọn hơn:
Dùng:
🔚 Tổng kết
sync.WaitGroup
là một công cụ rất mạnh khi làm việc với goroutine.Là Senior, bạn cần hiểu kỹ lifecycle, tránh race condition, và dùng kết hợp
channel
,context
,errgroup
(khi cần).Go’s concurrency dễ viết nhưng khó debug – nên cần cấu trúc và thói quen viết code rõ ràng, clean.
Last updated