Go by Example မြန်မာဘာသာ: Context

ယခင်ဥပမာမှာ ရိုးရှင်းတဲ့ HTTP server တစ်ခုတည်ဆောက်တာကို ကြည့်ခဲ့ပြီးပါပြီ။ HTTP server တွေဟာ context.Context ကိုသုံးပြီး cancel လုပ်တာကို သရုပ်ပြဖို့ အသုံးဝင်ပါတယ်။ Context က deadline တွေ၊ cancel signal တွေနဲ့ တခြား request-scoped value တွေကို API boundary တွေနဲ့ goroutine တွေကြား သယ်ဆောင်ပေးပါတယ်။

package main
import (
    "fmt"
    "net/http"
    "time"
)
func hello(w http.ResponseWriter, req *http.Request) {

context.Context တစ်ခုကို net/http စက်ယန္တရား(machinery)က request တိုင်းအတွက် ဖန်တီးပေးပြီး Context() method နဲ့ ရယူနိုင်ပါတယ်။

    ctx := req.Context()
    fmt.Println("server: hello handler started")
    defer fmt.Println("server: hello handler ended")

Client ဆီ ပြန်စာမပို့ခင် စက္ကန့်အနည်းငယ် စောင့်ပါမယ်။ ဒါဟာ server က အလုပ်လုပ်နေတာကို simulate လုပ်တာလို့ ယူဆနိုင်ပါတယ်။ အလုပ်လုပ်နေစဉ်မှာ context ရဲ့ Done() channel ကို စောင့်ကြည့်နေပြီး အလုပ်ကို cancel လုပ်ပြီး အမြန်ဆုံး ပြန်သွားဖို့ signal ကို စောင့်ကြည့်နေပါတယ်။

    select {
    case <-time.After(10 * time.Second):
        fmt.Fprintf(w, "hello\n")
    case <-ctx.Done():

context ရဲ့ Err() method က Done() channel ဘာကြောင့် ပိတ်သွားတယ်ဆိုတာကို ရှင်းပြတဲ့ error တစ်ခုကို ပြန်ပေးပါတယ်။

        err := ctx.Err()
        fmt.Println("server:", err)
        internalError := http.StatusInternalServerError
        http.Error(w, err.Error(), internalError)
    }
}
func main() {

အရင်ကလိုပဲ handler ကို “/hello” route မှာ register လုပ်ပြီး server စတင်လည်ပတ်စေပါတယ်။

    http.HandleFunc("/hello", hello)
    http.ListenAndServe(":8090", nil)
}

Server ကို နောက်ခံမှာ run ပါ။

$ go run context-in-http-servers.go &

Client က /hello ကို request လုပ်တာကို simulate လုပ်ပါ။ စလိုက်ပြီး မကြာခင်မှာပဲ Ctrl+C နှိပ်ပြီး cancel လုပ်တာကို signal ပေးပါ။

$ curl localhost:8090/hello
server: hello handler started
^C
server: context canceled
server: hello handler ended

နောက်ဥပမာ: Spawning Processes.