前回は、簡単な HTTP サーバー
をセットアップする例を見ました。HTTP サーバーは、
キャンセルを制御するための |
package main |
import ( "fmt" "net/http" "time" ) |
|
func hello(w http.ResponseWriter, req *http.Request) { |
|
|
ctx := req.Context() fmt.Println("server: hello handler started") defer fmt.Println("server: hello handler ended") |
クライアントに応答を返す前に数秒間待ちます。これは、
実際にサーバーがする何らかのタスクをシミュレートしています。
タスクを実行する間、コンテキストの |
select { case <-time.After(10 * time.Second): fmt.Fprintf(w, "hello\n") case <-ctx.Done(): |
コンテキストの |
err := ctx.Err() fmt.Println("server:", err) internalError := http.StatusInternalServerError http.Error(w, err.Error(), internalError) } } |
func main() { |
|
前回と同様に、”/hello” ルートに対するハンドラを登録し、 サーバーを開始します。 |
http.HandleFunc("/hello", hello) http.ListenAndServe(":8090", nil) } |
サーバーをバックグラウンドで実行します。 |
$ go run context-in-http-servers.go &
|
クライアントから |
$ curl localhost:8090/hello server: hello handler started ^C server: context canceled server: hello handler ended |
Next example: Spawning Processes.