การทำงานพร้อมกัน — ภาพรวม
JavaScript ทำงานแบบ single-threaded — Go ทำงานแบบ multi-threaded จริง ๆ
หัวข้อที่มีชื่อว่า “JavaScript ทำงานแบบ single-threaded — Go ทำงานแบบ multi-threaded จริง ๆ”ในฐานะนักพัฒนา TypeScript/Node.js คุณใช้ชีวิตอยู่กับ event loop โค้ด JS ทั้งหมดรันบน thread เดียว และ “concurrency” ที่คุณเห็นคือการสลับ context ไปมาระหว่าง callbacks, Promises และ async/await — ไม่ใช่ parallelism จริง
Go ต่างออกไปโดยสิ้นเชิง Go runtime จะ schedule goroutines ลงบน OS threads จริงหลายตัว goroutine หลายตัวจึงรันพร้อมกันได้จริงบน CPU คนละ core โดยไม่ต้องพึ่ง Worker Threads
Concurrency ≠ Parallelism
หัวข้อที่มีชื่อว่า “Concurrency ≠ Parallelism”Rob Pike (หนึ่งในผู้สร้าง Go) อธิบายไว้ได้ชัดเจนว่า:
- Concurrency คือการจัดการหลายสิ่งพร้อมกัน — เป็นเรื่องของโครงสร้าง
- Parallelism คือการทำหลายสิ่งพร้อมกันจริง — เป็นเรื่องของการรัน
เชฟที่สับผักไปตอนที่น้ำกำลังเดือด = concurrent (จัดการหลายอย่างพร้อมกัน) ส่วนเชฟสองคนทำงานเคียงข้างกันในครัวเดียว = parallel (ทำหลายอย่างพร้อมกันจริง)
Node.js เก่งเรื่อง concurrency (non-blocking I/O) แต่ทำ parallelism จริงไม่ได้ถ้าไม่ใช้ Worker Threads หรือแยกหลาย process ส่วน Go รองรับทั้งสองอย่างได้ในตัว
โมเดล concurrency เปรียบเทียบ
หัวข้อที่มีชื่อว่า “โมเดล concurrency เปรียบเทียบ”// JavaScript: single-threaded event loop// "concurrency" through callbacks / Promisesasync function fetchData(url: string) { const res = await fetch(url); // yields to event loop return res.json();}
// setTimeout / setInterval schedule callbacks on the loopsetTimeout(() => console.log("later"), 0);console.log("first"); // always prints before "later"// Go: real concurrent goroutines// Each 'go' spawns a lightweight thread managed by Go runtimepackage main
import ( "fmt" "sync")
func fetchData(url string, wg *sync.WaitGroup) { defer wg.Done() fmt.Println("Fetching:", url) // runs concurrently}
func main() { var wg sync.WaitGroup urls := []string{"api/users", "api/orders", "api/products"} for _, url := range urls { wg.Add(1) go fetchData(url, &wg) } wg.Wait() // block until all goroutines finish}สิ่งที่จะเรียนในโมดูลนี้
หัวข้อที่มีชื่อว่า “สิ่งที่จะเรียนในโมดูลนี้”- Goroutines —
go f()สร้าง goroutine ได้ทันที; เปรียบเทียบกับ async functions - Channels — ท่อส่งข้อมูลระหว่าง goroutines; เปรียบเทียบกับ Promises/callbacks
- Select — เลือกจากหลาย channels พร้อมกัน; เปรียบเทียบกับ
Promise.race - Sync —
WaitGroup,Mutex,RWMutexสำหรับ shared state - Context — cancellation และ deadlines; เปรียบเทียบกับ
AbortController - Worker Pools — pattern สำหรับจัดการงานพร้อมกันอย่างมีประสิทธิภาพ
package main
import ( "fmt" "sync")
func task(name string, wg *sync.WaitGroup) { defer wg.Done() fmt.Printf("Task %s running\n", name)}
func main() { var wg sync.WaitGroup tasks := []string{"A", "B", "C"} for _, t := range tasks { wg.Add(1) go task(t, &wg) } wg.Wait() fmt.Println("All tasks complete")}Loading Go runtime (first run only, ~8 MB)…