http コンテキストに移動し、POST リクエストでキャンセルをリクエストする
クライアントが本文なしで GET リクエストを送信すると、サーバーはそれを検出できます。クライアントが接続を閉じたときのキャンセル信号。これは、リクエスト本文を読み取り、クライアントが切断されたことを検出することで実現されます。
ただし、クライアントがリクエスト本文を含む POST リクエストを送信すると、サーバーはキャンセル信号を即座に検出できません。これは、アプリケーションが明示的に行うまで、サーバーはリクエスト本文の読み取りを開始しないためです。その結果、サーバーはリクエストの期限が来るまでキャンセル信号をキャプチャできません。
この問題に対処し、Go コンテキスト パッケージでキャンセルを適切に処理するには、リクエストの本文をすぐに読み取ります 。これにより、サーバーはクライアントが切断されたことを検出し、不要な作業をできるだけ早くキャンセルできるようになります。 POST リクエストの本文を読み取ることで、サーバーの接続チェックがトリガーされ、接続の読み取りが開始され、閉じられた接続が検出されます。
ここでは、コードを変更してリクエストの本文を読み取り、キャンセル信号の即時送信:
func handler(w http.ResponseWriter, r *http.Request) { go func(done <-chan struct{}) { <-done fmt.Println("message", "client connection has gone away, request got cancelled") }(r.Context().Done()) io.Copy(ioutil.Discard, r.Body) // Read the body time.Sleep(30 * time.Second) fmt.Fprintf(w, "Hi there, I love %s!\n", r.URL.Path[1:]) }
リクエスト本文を明示的に読み取ることで、サーバーはクライアントが接続を閉じるとすぐにキャンセル信号を検出でき、サーバー上のリソースをタイムリーに解放できます。側面。
以上がGo の Context パッケージは POST リクエストのキャンセル処理をどのように改善できるでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。