Channel Synchronization

Channel Synchronization #

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

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` စမလုပ်ခင်ကတည်းက ပရိုဂရမ်က ထွက်သွားပါလိမ့်မယ်။