ในโลกของการพัฒนาแอปพลิเคชันที่ต้องรองรับการทำงานจำนวนมากพร้อมกัน การใช้ Queue และ Worker Pool คือหนึ่งในวิธีที่ช่วยให้เราสามารถจัดการกับงานหลายชิ้นได้อย่างมีประสิทธิภาพ โดยเฉพาะอย่างยิ่งในภาษา Go ที่มี goroutine และ channel เป็นพื้นฐานที่ทรงพลัง
ทำไมต้องใช้ Queue และ Worker Pool?
- เพิ่มประสิทธิภาพในการจัดการงานหลายชิ้น (concurrent tasks)
- ควบคุมจำนวน goroutine ที่ทำงานพร้อมกันได้
- ลดความเสี่ยงจาก resource exhaustion หรือ deadlock
แนวคิดเบื้องหลัง
ใช้ channel เป็น queue สำหรับเก็บงาน และมี worker หลายตัว (goroutine) ที่รอรับงานจาก queue ไปประมวลผล
ภาพแนวคิด:

โค้ดตัวอย่าง: ระบบ Worker Pool ใน Go
package main
import (
"fmt"
"math/rand"
"sync"
"time"
)
const (
numJobs = 10
numWorkers = 3
)
func worker(id int, jobs <-chan int, wg *sync.WaitGroup) {
defer wg.Done()
for job := range jobs {
fmt.Printf("🔧 Worker %d started job %d\n", id, job)
time.Sleep(time.Millisecond * time.Duration(rand.Intn(500)+100))
fmt.Printf("✅ Worker %d finished job %d\n", id, job)
}
}
func main() {
rand.Seed(time.Now().UnixNano())
jobs := make(chan int, numJobs)
var wg sync.WaitGroup
for i := 1; i <= numWorkers; i++ {
wg.Add(1)
go worker(i, jobs, &wg)
}
for j := 1; j <= numJobs; j++ {
jobs <- j
fmt.Printf("📤 Sent job %d\n", j)
}
close(jobs)
wg.Wait()
fmt.Println("🎉 All jobs processed.")
}
ผลลัพธ์จากการรัน
📤 Sent job 1 📤 Sent job 2 ... 🔧 Worker 1 started job 1 ✅ Worker 1 finished job 1 🎉 All jobs processed.
ขยายความสามารถ
- จัดการ error ด้วย channel error
- รองรับ context cancellation
- เพิ่ม priority ให้กับ queue ด้วย heap หรือ priority queue
เคล็ดลับ
- ใช้ sync.WaitGroup เพื่อรอให้ worker ทำงานเสร็จ
- ระวัง deadlock เมื่อไม่ปิด channel
- อย่ามี worker pool ใหญ่เกินไป เพราะอาจกิน resource เกินความจำเป็น
สถานการณ์ที่ควรใช้
- ระบบ backend ที่ประมวลผล background jobs เช่น การส่งอีเมล หรือแปลงไฟล์
- จำกัดจำนวน concurrent HTTP requests
- งานที่ใช้เวลาประมวลผลสูง เช่น AI inferencing หรือ image processing
สรุป
การสร้างระบบ Queue ร่วมกับ Worker Pool ใน Go เป็นแนวทางที่สะดวกและมีประสิทธิภาพในการจัดการกับงานจำนวนมากแบบ asynchronous และ concurrent เหมาะกับงาน backend ที่ต้องการประสิทธิภาพและความยืดหยุ่นสูง
แหล่งอ้างอิง
ข้อความสำหรับ SEO
Golang worker pool | Golang channel queue | ทำระบบ queue go | background job go | goroutine และ channel | go concurrency