Thuta Learning
ရှာဖွေရန်
AdvancedProgrammingbeginner

Mini Project

စိတ်လျှော့ပါ။ ဒီခန်းကို စာအုပ်လိုမဟုတ်ဘဲ စကားပြောသလိုပဲ၊ နားလည်လွယ်အောင် ရှင်းပါမယ်။

ဒီ 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-3

Info

jobs <-chan string က receive-only channel ဖြစ်ပြီး results chan<- string က send-only channel ဖြစ်ပါတယ်။ Function signature ထဲမှာ direction သတ်မှတ်ထားတာက code ကိုပိုလုံခြုံစေပါတယ်။

ဒီနေရာမှာ လူအများမှားတတ်တယ်

  • close(jobs) မလုပ်ရင် worker က jobs channel ထဲနောက်ထပ် data စောင့်နေနိုင်ပါတယ်။ Channel lifecycle ကိုသေချာစီမံပါ။
Mini Project | Thuta Learning