Goroutines != Threads

แล้วมันทำงานยังไงหล่ะ ?

เนื้อหาในบทความนี้เกิดจากการศึกษาด้วยตัวเองจากหลาย ๆ บทความ อาจจะไม่ถูก 100% แต่น่าจะพอเป็น concept ให้เข้าใจ Goroutines มากขึ้น

หลาย ๆ คนคงรู้แล้วว่า Goroutines เบากว่า Threads หลายร้อยเท่า แต่รู้รึเปล่าว่ามันทำงานยังไง ?

ใน Go เราสามารถกำหนดค่า GOMAXPROCS ได้ (ปกติแล้วจะใช้ค่าตามจำนวน CPUs ของเครื่อง) เอาไว้บอกว่าจะให้รัน Goroutines พร้อมกันกี่ตัว

ถ้าให้

  • M คือ machine หรือก็คือ thread
  • P คือ processor หรือตัวจัดการ goroutines
  • G คือ goroutine

ดังนั้นถ้าเรากำหนดให้ GOMAXPROCS=2 เราจะได้หน้าตาประมาณนี้

โดนที่ G สีเข้มหมายถึง goroutine ที่กำลังรันอยู่ ส่วนสีเทาหมายถึง goroutines ที่ไม่ได้รัน แต่พร้อมที่จะรันแล้ว

ถ้า G ตัวที่รันอยู่เรียก syscall ทำให้เกิด blocked thread (เช่นอ่าน/เขียนไฟล์) goroutines ตัวอื่นจะถูกส่งไป thread อื่น

Go อาจจะสร้าง thread ใหม่ขึ้นมา เพื่อให้สามารถทำงานได้พร้อมกันเท่ากับ GOMAXPROCS

P ที่อยู่กับ thread ใหม่ จึงไปขโมยงานจาก P อีกตัวที่งานเยอะอยู่เพื่อมาแบ่งกันทำงาน

พอ G ที่อยู่กับ blocked thread ทำงานเสร็จจะถูกเอามาทำงานต่อ และ Go อาจจะลบ thread นั้นทิ้ง

จะเห็นว่าจำนวน thread นั้นไม่จำเป็นที่จะต้องเท่ากับจำนวน processor เสมอไป



ขายของ ตอนนี้เปิดคอร์ส Go อยู่นะ 😘
https://acourse.io/course/golang-for-beginner

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.