ホームページ >バックエンド開発 >Golang >Go: ResponseController の期限が守られない

Go: ResponseController の期限が守られない

王林
王林転載
2024-02-09 12:09:08835ブラウズ

Go:不遵守 ResponseController 的截止日期

phpエディタのいちごが「Go: ResponseControllerの期限を守らない」について紹介します。ソフトウェア開発では、ResponseController は応答要求を処理するために使用される一般的なコントローラーです。ただし、開発者がコードを記述するときに ResponseController の期限を遵守しない場合があり、これにより一連の問題が発生する可能性があります。この記事では、この問題を詳しく調査し、コードの信頼性と安定性を確保するための解決策を提供します。

質問内容

書き込みに時間がかかりすぎる場合に、クライアントへの書き込みをキャンセルしようとするコードがいくつかあります。 http.responsecontroller には setwritedeadline メソッドがあるので、これを使用できると思います。

残念ながら、以下のコードでは、rw.write は期限が過ぎてもエラーを返しません。

書き込みをキャンセルする他の方法はありますか?

リーリー リーリー
package main

import (
    "log"
    "net/http"
    "time"
)

func main() {
    http.handlefunc("/", func(rw http.responsewriter, r *http.request) {
        log.println(r.method, r.url.path)

        rc := http.newresponsecontroller(rw)
        dl := time.now().add(3 * time.second)
        if err := rc.setwritedeadline(dl); err != nil {
            log.println(err)
            return
        }
        log.println("write deadline:", dl)

        var total int
        for _, b := range []byte("what!\n") {
            time.sleep(time.second)

            n, err := rw.write([]byte{b})
            if err != nil {
                log.println(err)
                return
            }

            total += n
            log.println("bytes written", n)
        }

        log.println(r.method, r.url.path, "write total", total)
    })

    http.listenandserve(":8080", nil)
}

ソリューション

setwritedeadline ドキュメント の内容:

setwritedeadline 応答を書く期限を設定します。期限が過ぎた後の応答本文の書き込みはブロックされませんが、データがバッファリングされている場合は成功する可能性があります。

アプリケーションによって書き込まれた少量のデータがバッファリングされるため、質問内の応答ライターへの書き込みは成功します。

カールからの「サーバーからの空の応答」エラーは、サーバーがハンドラーから戻ったときに基礎となるネットワーク接続への応答をフラッシュするときに期限が遵守されることを示します。

setwritedeadline を使用して、クライアントの速度低下を防ぎます。

期限付きのコンテキスト

を使用して、サーバーが応答を生成するのにかかる時間を制限します: 65bd46fc4 2月

以上がGo: ResponseController の期限が守られないの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。