Signals
#
// တစ်ခါတစ်ရံတွင် ကျွန်ုပ်တို့၏ Go ပရိုဂရမ်များသည်
// Unix signals များကို အသိဉာဏ်ရှိစွာ ကိုင်တွယ်စေလိုပါသည်။
// ဥပမာအားဖြင့်၊ server တစ်ခုသည် SIGTERM လက်ခံရရှိသောအခါ
// သင့်တော်စွာ ပိတ်သိမ်းစေလိုခြင်း၊ သို့မဟုတ် command-line
// tool တစ်ခုသည် SIGINT လက်ခံရရှိသောအခါ input
// ပြုလုပ်ခြင်းကို ရပ်တန့်စေလိုခြင်းတို့ ဖြစ်နိုင်ပါသည်။
// အောက်ပါသည် Go တွင် channels များဖြင့်
// signals များကို ကိုင်တွယ်နည်း ဖြစ်ပါသည်။
package main
import (
"fmt"
"os"
"os/signal"
"syscall"
)
func main() {
// Go signal notification သည် os.Signal တန်ဖိုးများကို
// channel တစ်ခုပေါ်သို့ ပေးပို့ခြင်းဖြင့် အလုပ်လုပ်ပါသည်။
// ဤ notifications များကို လက်ခံရန် channel တစ်ခု ဖန်တီးပါမည်။
// ဤ channel သည် buffered ဖြစ်သင့်ကြောင်း သတိပြုပါ။
sigs := make(chan os.Signal, 1)
// signal.Notify သည် သတ်မှတ်ထားသော signals
// များ၏ notifications များကို လက်ခံရန်
// ပေးထားသော channel ကို မှတ်ပုံတင်ပါသည်။
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
// ကျွန်ုပ်တို့သည် main function ထဲတွင် sigs မှ လက်ခံနိုင်ပါသည်၊
// သို့သော် ဤလုပ်ဆောင်ချက်ကို သီးခြား goroutine
// တစ်ခုတွင် မည်ကဲ့သို့ ပြုလုပ်နိုင်ကြောင်း ကြည့်ကြပါစို့၊
// ပိုမို realistic ဖြစ်သော graceful shutdown
// ဖြစ်စဉ်ကို သရုပ်ပြရန် ဖြစ်ပါသည်။
done := make(chan bool, 1)
go func() {
// ဤ goroutine သည် signals အတွက် blocking receive ကို executes လုပ်ပါသည်။
// ၎င်းသည် signal တစ်ခုရရှိသောအခါ ထို signal ကို ပုံနှိပ် (print) ဖော်ပြပြီး
// ပရိုဂရမ်အား ပြီးဆုံးနိုင်ကြောင်း အသိပေးပါလိမ့်မည်။
sig := <-sigs
fmt.Println()
fmt.Println(sig)
done <- true
}()
// ပရိုဂရမ်သည် မျှော်လင့်ထားသော signal ရရှိသည်အထိ
// ဤနေရာတွင် စောင့်ဆိုင်းနေပါမည်
// (အထက်ပါ goroutine မှ done ပေါ်တွင် တန်ဖိုးတစ်ခု ပေးပို့ခြင်းဖြင့် ညွှန်ပြထားသည့်အတိုင်း)
// ထို့နောက် ထွက်ခွာပါမည်။
fmt.Println("awaiting signal")
<-done
fmt.Println("exiting")
}
# ဤပရိုဂရမ်ကို ကျွန်ုပ်တို့ run သောအခါ၊ ၎င်းသည်
# signal တစ်ခုကို စောင့်ဆိုင်းရန် block လုပ်ထားပါမည်။
# ctrl-C ကို နှိပ်ခြင်းဖြင့် (terminal က ^C
# အဖြစ် ပြသပါသည်) ကျွန်ုပ်တို့သည် SIGINT signal ကို
# ပို့နိုင်ပြီး၊ ထိုအခါ ပရိုဂရမ်သည် "interrupt"
# ဟု ပုံနှိပ်ဖော်ပြပြီး ထွက်ခွာသွားပါမည်။
$ go run signals.go
awaiting signal
^C
interrupt
exiting