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