
บทนำ
หนึ่งในฟีเจอร์ที่ทำให้ภาษา Go โดดเด่นคือความสามารถในการทำงานหลายอย่างพร้อมกันได้ (concurrent) อย่างง่ายดายผ่าน goroutine และ channel แต่หลายคนยังสับสนระหว่างคำว่า Concurrency กับ Parallelism ว่าแตกต่างกันอย่างไร ในบทความนี้เราจะอธิบายความหมาย เปรียบเทียบ และยกตัวอย่างให้เห็นภาพแบบชัดเจนที่สุด
Concurrency คืออะไร?
Concurrency คือความสามารถของโปรแกรมในการ จัดการหลายงาน (tasks) พร้อมกัน โดยอาจจะไม่ได้ทำงานทุกอย่างในเวลาเดียวกันจริง ๆ แต่สามารถสลับไปมาระหว่าง task ได้อย่างมีประสิทธิภาพ
นึกภาพ: คนคนหนึ่งทำหลายอย่างในเวลาใกล้ ๆ กัน เช่น อ่านหนังสือแล้วหยุดมาตอบไลน์ แล้วกลับไปอ่านต่อ
ตัวอย่าง Concurrency ใน Go
func task(name string) {
for i := 0; i < 3; i++ {
fmt.Println(name, ":", i)
time.Sleep(100 * time.Millisecond)
}
}
func main() {
go task("A")
go task("B")
time.Sleep(1 * time.Second)
}
ผลลัพธ์คือ function ทั้ง 2 จะ ทำงานสลับกัน บน thread เดียว
Parallelism คืออะไร?
Parallelism คือความสามารถในการ ทำงานหลายอย่างจริง ๆ ในเวลาเดียวกัน โดยใช้หลาย core ของ CPU
นึกภาพ: คนสองคนอ่านหนังสือพร้อมกันคนละเล่ม
ตั้งค่าการทำ Parallel
โดยปกติ Go จะใช้ parallel ได้อัตโนมัติผ่าน GOMAXPROCS:
runtime.GOMAXPROCS(runtime.NumCPU())
ตัวอย่าง Parallel
func compute(n int) {
sum := 0
for i := 0; i < 100000000; i++ {
sum += i
}
fmt.Println("Done", n)
}
func main() {
runtime.GOMAXPROCS(2)
go compute(1)
go compute(2)
time.Sleep(2 * time.Second)
}
หากเครื่องมีหลาย core จะเห็นว่า Go ทำงานสอง process นี้พร้อมกันจริง ๆ
เปรียบเทียบ Concurrency vs Parallelism
| หัวข้อ | Concurrency | Parallelism |
|---|---|---|
| การทำงาน | จัดการหลายงาน พร้อมกัน | ทำหลายงานในเวลาเดียวกันจริง ๆ |
| ใช้ CPU กี่ core | 1 core ก็ได้ | หลาย core |
| เหมาะกับ | แอปที่ต้องรอ IO เช่น HTTP | แอปประมวลผลหนัก เช่น ML |
| ตัวอย่างใน Go | Goroutine + Channel | GOMAXPROCS + Goroutine |
ภาพประกอบความแตกต่าง

Go มีอะไรช่วยจัดการเรื่องนี้บ้าง?
goroutine– หน่วยการทำงานพร้อมกันchannel– ส่งข้อมูลระหว่าง goroutinesync.WaitGroup– รอให้ goroutine ทำงานเสร็จruntime.GOMAXPROCS– ควบคุมการใช้ core
ตัวอย่างใช้ WaitGroup
var wg sync.WaitGroup
func worker(id int) {
defer wg.Done()
fmt.Println("Working:", id)
time.Sleep(1 * time.Second)
}
func main() {
wg.Add(2)
go worker(1)
go worker(2)
wg.Wait()
fmt.Println("All done")
}
สรุป
Concurrency คือการออกแบบระบบให้ทำงานพร้อมกันได้ ส่วน Parallelism คือการใช้หลาย CPU ทำงานพร้อมกันจริง ๆ ทั้งสองแนวคิดมีประโยชน์ต่างกันและสามารถใช้ร่วมกันในภาษา Go ได้อย่างมีประสิทธิภาพ
หากคุณเข้าใจทั้ง 2 แนวคิด จะสามารถออกแบบระบบที่เร็วและยืดหยุ่นกว่าเดิมมาก!
บทความโดย: poolsawat.com | เขียนโดย: King Pool