keyboard_tabSkip to content
listGoAPI Essential

รู้จักกับ Goroutine

สารบัญ

go-routine-channel สามารถดู video ของหัวข้อนี้ก่อนได้ ดู video

Concurrent คืออะไร ?

การเขียนโปรแกรมที่ทำให้โปรแกรมสามารถทำงานหลาย ๆ อย่างพร้อมกันได้ โดยใช้หน่วยประมวลผล (CPU) ร่วมกัน

ใน Go นั้น มีวิธีการเขียนโปรแกรมแบบ concurrent อยู่หลายวิธี

  • Goroutines = หน่วยของการทำงานแบบ concurrent ใน Go โดยแต่ละ Goroutine จะทำงานแบบอิสระต่อกัน และไม่รบกวนการทำงานของ Goroutine อื่น ๆ
  • Channels = ช่องทางที่ใช้สำหรับการสื่อสารระหว่าง Goroutines ด้วยกัน
  • Waitgroups = โครงสร้างข้อมูลที่ใช้สำหรับรอให้ Goroutines ทั้งหมดทำงานเสร็จสิ้น

เริ่มต้นใช้งาน Go routine

go
package main

import (
  "fmt"
  "time"
)

func main() {
  // สร้าง Goroutines ใหม่ 2 ตัว
  go doSomething1()
  go doSomething2()

  // รอให้ Goroutines ทั้งสองตัวทำงานเสร็จสิ้น
  time.Sleep(time.Second)

  // พิมพ์ข้อความ
  fmt.Println("Done")
}

func doSomething1() {
  fmt.Println("Doing something 1")
}

func doSomething2() {
  fmt.Println("Doing something 2")
}

ประโยชน์และข้อพิจารณาของการเขียนแบบ Concurrent

ประโยชน์ใหญ่ๆ

  • สามารถเพิ่มประสิทธิภาพในการทำงานของโปรแกรมได้
  • สามารถปรับปรุงประสบการณ์การใช้งานของผู้ใช้ได้
  • สามารถรองรับการทำงานจำนวนมาก ๆ ได้

การเขียนโปรแกรมแบบ concurrent นั้นจำเป็นต้องมีความเข้าใจเกี่ยวกับหลักการของ concurrency และ synchronization เพื่อหลีกเลี่ยงปัญหาที่อาจเกิดขึ้น

  • Deadlock = สถานการณ์ที่ Goroutines สองตัวหรือมากกว่านั้น ต่างก็รอให้ Goroutines อีกตัวหนึ่งทำงานเสร็จสิ้นก่อน จึงจะทำงานต่อได้ แต่ Goroutines ทั้งสองตัวหรือมากกว่านั้น ต่างก็รอให้ Goroutines อีกตัวหนึ่งทำงานเสร็จสิ้นก่อนเช่นกัน
  • Race condition = สถานการณ์ที่ Goroutines สองตัวหรือมากกว่านั้น พยายามเข้าถึงข้อมูลร่วมกันในเวลาเดียวกัน และการเปลี่ยนแปลงข้อมูลนั้นอาจทำให้ผลลัพธ์ที่ไม่คาดคิดเกิดขึ้นได้