การดู : 403

25/04/2026 02:47น.

Ep.19 Go กับ Worker Pool เพิ่มพลังการประมวลผลหลายงานพร้อมกัน!

Ep.19 Go กับ Worker Pool เพิ่มพลังการประมวลผลหลายงานพร้อมกัน!

#การศึกษาการเขียนโปรแกรม

#การพัฒนาโปรแกรม

#การจัดการงาน

#ประสิทธิภาพ

#Channels

#Goroutines

#การประมวลผลพร้อมกัน

#Worker Pool

#ภาษา Go

#Golang

#Go

#Superdev School

#โปรแกรมเมอร์

#ภาษาโปรแกรม

#การเขียนโปรแกรมสำหรับมือใหม่

#การเขียนโปรแกรม

Go กับ Worker Pool เพิ่มพลังการประมวลผลหลายงานพร้อมกัน!

 

Worker Pool คืออะไร?

Worker Pool คือโครงสร้างที่แบ่งการทำงานออกเป็นหลายส่วน และกระจายงานให้กับ "Worker" ที่ทำงานพร้อมกันแบบ Concurrency ช่วยให้โปรแกรมสามารถประมวลผลงานได้รวดเร็วขึ้น โดยไม่ต้องรอให้ Worker หนึ่งทำงานเสร็จก่อนจึงจะเริ่มงานถัดไป

 

การสร้าง Worker Pool ใน Go

เราจะสร้าง Worker Pool โดยใช้ Goroutines และ Channels เพื่อสื่อสารระหว่างงานและ Worker ต่างๆ

 

ขั้นตอนการสร้าง Worker Pool แบบง่ายๆ

1. สร้าง Channel สำหรับรับงานและส่งผลลัพธ์

เราจะสร้าง Channel ที่ใช้ส่งงานไปยัง Worker และ Channel สำหรับเก็บผลลัพธ์ที่ Worker ส่งกลับมา

jobs := make(chan int, 5)     // ช่องรับงาน
results := make(chan int, 5)  // ช่องรับผลลัพธ์

 

2. สร้างฟังก์ชัน Worker

Worker จะทำงานที่ได้รับจาก Channel และส่งผลลัพธ์กลับมาผ่าน Channel ของผลลัพธ์

ตัวอย่างโค้ดฟังก์ชัน Worker:

func worker(id int, jobs <-chan int, results chan<- int) {
    for job := range jobs {
        fmt.Printf("Worker %d started job %d\n", id, job)
        time.Sleep(time.Second) // จำลองเวลาทำงาน
        fmt.Printf("Worker %d finished job %d\n", id, job)
        results <- job * 2 // ส่งผลลัพธ์กลับไปยัง results
    }
}

 

3. เริ่มต้นหลาย Worker ทำงานพร้อมกัน

เราสามารถสร้างหลาย Worker (Goroutines) ที่คอยรับงานจาก Channel

ตัวอย่างการเริ่มต้น Worker:

for w := 1; w <= 3; w++ { // สร้าง Worker 3 ตัว
    go worker(w, jobs, results)
}

 

4. ส่งงานเข้าสู่ Channel ของงาน

เราจะส่งงานเข้า Channel jobs เพื่อให้ Worker นำไปประมวลผล

ตัวอย่างการส่งงาน:

for j := 1; j <= 5; j++ {
    jobs <- j
}
close(jobs) // ปิด Channel ของงานเมื่อส่งงานครบ

 

5. รับผลลัพธ์จาก Channel ของผลลัพธ์

รับผลลัพธ์จาก Channel results ซึ่ง Worker ได้ส่งกลับมา

ตัวอย่างการรับผลลัพธ์:

for a := 1; a <= 5; a++ {
    result := <-results
    fmt.Println("Result:", result)
}

 

ตัวอย่างโค้ดเต็มของ Worker Pool

การทำงานของโปรแกรม:

โปรแกรมจะสร้าง Worker 3 ตัว และส่งงาน 5 งานให้ Worker จัดการ

Worker แต่ละตัวจะทำงานที่ได้รับแบบพร้อมกันและส่งผลลัพธ์กลับไปยัง Channel ของผลลัพธ์

package main

import (
    "fmt"
    "time"
)

func worker(id int, jobs <-chan int, results chan<- int) {
    for job := range jobs {
        fmt.Printf("Worker %d started job %d\n", id, job)
        time.Sleep(time.Second) // จำลองเวลาทำงาน
        fmt.Printf("Worker %d finished job %d\n", id, job)
        results <- job * 2 // ส่งผลลัพธ์
    }
}

func main() {
    jobs := make(chan int, 5)
    results := make(chan int, 5)

    for w := 1; w <= 3; w++ {
        go worker(w, jobs, results)
    }

    for j := 1; j <= 5; j++ {
        jobs <- j
    }
    close(jobs)

    for a := 1; a <= 5; a++ {
        fmt.Println("Result:", <-results)
    }
}

 

ประโยชน์ของ Worker Pool

  • ประหยัดทรัพยากร: ทำงานหลายอย่างพร้อมกันโดยใช้จำนวน Worker ที่จำกัด
  • เพิ่มประสิทธิภาพ: ลดเวลารอคอยเนื่องจากงานแบ่งทำหลายส่วน
  • จัดการได้ง่าย: เหมาะสำหรับงานที่ต้องการทำซ้ำๆ ในปริมาณมาก

 

สรุปง่ายๆ

  • สร้าง Channel สำหรับส่งงานและรับผลลัพธ์
  • ใช้ Goroutine ในการสร้าง Worker หลายตัว
  • ส่งงานให้ Worker ผ่าน Channel และรับผลลัพธ์เมื่อเสร็จ