Skip to main content

รู้จักกับ Goroutine

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

Concurrent คืออะไร ?

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

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

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

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

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 สองตัวหรือมากกว่านั้น พยายามเข้าถึงข้อมูลร่วมกันในเวลาเดียวกัน และการเปลี่ยนแปลงข้อมูลนั้นอาจทำให้ผลลัพธ์ที่ไม่คาดคิดเกิดขึ้นได้