การดู : 0

12/04/2026 18:15น.

EP.8 Go กับ Goroutines - ทำหลายงานพร้อมกันแบบมือโปร!

EP.8 Go กับ Goroutines - ทำหลายงานพร้อมกันแบบมือโปร!

#การพัฒนาแอปพลิเคชัน

#sync

#Channels

#Concurrency

#Goroutines

#Go

Go กับ Goroutines - ทำหลายงานพร้อมกันแบบมือโปร!

อยากให้โปรแกรมทำงานหลายอย่างพร้อมกันได้อย่างรวดเร็วไหม? วันนี้เราจะมาสอนการใช้ Goroutines และ Channels ใน Go ที่จะทำให้โปรแกรมของคุณประมวลผลได้ลื่นไหลและไม่ติดขัด

 

Goroutines คืออะไร?
Goroutine คือหน่วยประมวลผลขนาดเล็กที่ Go ใช้สำหรับการทำงานพร้อมกัน (concurrent). เมื่อเราสร้าง Goroutine, Go จะทำงานในเบื้องหลังโดยไม่บล็อกโปรแกรมหลัก ทำให้เราสามารถรันงานหลายงานไปพร้อมกันได้
ตัวอย่าง Goroutine:

package main

import (
    "fmt"
    "time"
)

func printNumbers() {
    for i := 1; i <= 5; i++ {
        fmt.Println(i)
        time.Sleep(500 * time.Millisecond)
    }
}

func main() {
    go printNumbers() // สร้าง Goroutine
    fmt.Println("Goroutine started")
    time.Sleep(3 * time.Second) // รอให้ Goroutine ทำงานเสร็จ
}

 

Channels: การสื่อสารระหว่าง Goroutines
Channels ใช้สำหรับส่งข้อมูลระหว่าง Goroutines ทำให้การทำงานพร้อมกันปลอดภัยและเป็นระเบียบมากขึ้น
ตัวอย่าง Channel:

func main() {
    messages := make(chan string)

    go func() {
        messages <- "Hello from Goroutine" // ส่งข้อมูลผ่าน Channel
    }()

    msg := <-messages // รับข้อมูลจาก Channel
    fmt.Println(msg)
}

 

Buffered Channels:
Channels สามารถบัฟเฟอร์เพื่อเก็บข้อมูลได้หลายค่า:

func main() {
    messages := make(chan string, 2) // บัฟเฟอร์ได้ 2 ค่า

    messages <- "First"
    messages <- "Second"

    fmt.Println(<-messages)
    fmt.Println(<-messages)
}

 

การควบคุม Concurrency ด้วย sync
Go มีแพ็กเกจ sync สำหรับควบคุม Concurrency เช่นการรอให้ Goroutines ทำงานเสร็จ:

import (
    "fmt"
    "sync"
)

func worker(wg *sync.WaitGroup, id int) {
    fmt.Printf("Worker %d starting\n", id)
    wg.Done() // ลดตัวนับลง 1
}

func main() {
    var wg sync.WaitGroup

    for i := 1; i <= 3; i++ {
        wg.Add(1)
        go worker(&wg, i)
    }

    wg.Wait() // รอให้ทุก Goroutine ทำงานเสร็จ
    fmt.Println("All workers done")
}