Go by Example မြန်မာဘာသာ: Channel Synchronization

ကျွန်တော်တို့က channel တွေကို goroutine တွေကြား execution ကို synchronize (ချိန်ကိုက်) လုပ်ဖို့ သုံးနိုင်ပါတယ်။ ဒီဥပမာမှာ goroutine တစ်ခု ပြီးဆုံးတာကို စောင့်ဆိုင်းဖို့ blocking receive ကို သုံးပြထားပါတယ်။ Goroutine အများကြီး ပြီးဆုံးတာကို စောင့်မယ်ဆိုရင်တော့ WaitGroup သုံးတာက ပိုသင့်တော်နိုင်ပါတယ်။

package main
import (
    "fmt"
    "time"
)

ဒါက goroutine အနေနဲ့ run မယ့် function ပါ။ done channel က ဒီ function ရဲ့ အလုပ်ပြီးပြီဆိုတာကို တခြား goroutine ကို အသိပေးဖို့ သုံးမှာပါ။

func worker(done chan bool) {
    fmt.Print("working...")
    time.Sleep(time.Second)
    fmt.Println("done")

အလုပ်ပြီးပြီဆိုတာ အသိပေးဖို့ value တခု ပို့လိုက်ပါတယ်။

    done <- true
}
func main() {

Worker goroutine တစ်ခု စတင်ပါတယ်၊ သူ့ကို အသိပေး (notify) ဖို့ channel ကိုလည်း ပေးလိုက်ပါတယ်။

    done := make(chan bool, 1)
    go worker(done)

Worker က channel ပေါ်မှာ အသိပေး (nofity) တဲ့အထိ block လုပ်ထားပါတယ်။

    <-done
}
$ go run channel-synchronization.go      
working...done                  

ဒီပရိုဂရမ်ထဲက <- done လိုင်းကို ဖျက်လိုက်မယ်ဆိုရင်၊ worker စမလုပ်ခင်ကတည်းက ပရိုဂရမ်က ထွက်သွားပါလိမ့်မယ်။

နောက်ဥပမာ: Channel Directions.