ဒီ mini project မှာ jobs တွေကို worker goroutines တွေက channel ကနေယူပြီး process လုပ်တဲ့ပုံစံကိုရေးပါမယ်။ Real-world မှာ background email sender, image processor, order processor, queue worker စတဲ့ system တွေကိုနားလည်ဖို့ အခြေခံကောင်းတစ်ခုပါ။
go
package main
import (
"fmt"
"time"
)
func worker(id int, jobs <-chan string, results chan<- string) {
for job := range jobs {
fmt.Println("worker", id, "started", job)
time.Sleep(200 * time.Millisecond)
results <- fmt.Sprintf("worker %d finished %s", id, job)
}
}
func main() {
jobs := make(chan string, 3)
results := make(chan string, 3)
for w := 1; w <= 2; w++ {
go worker(w, jobs, results)
}
for j := 1; j <= 3; j++ {
jobs <- fmt.Sprintf("job-%d", j)
}
close(jobs)
for r := 1; r <= 3; r++ {
fmt.Println(<-results)
}
}jobs channel ထဲ job တွေထည့်ပြီး worker goroutines တွေက range jobs နဲ့ယူလုပ်ပါတယ်။ results channel ကပြီးသွားတဲ့ result တွေကို main function ဆီပြန်ပို့ပါတယ်။
You should see
(Order may vary) worker 2 started job-1 worker 1 started job-2 worker 2 finished job-1 worker 1 finished job-2 worker 2 started job-3 worker 2 finished job-3Info
jobs <-chan string က receive-only channel ဖြစ်ပြီး results chan<- string က send-only channel ဖြစ်ပါတယ်။ Function signature ထဲမှာ direction သတ်မှတ်ထားတာက code ကိုပိုလုံခြုံစေပါတယ်။