Heim >Backend-Entwicklung >Golang >Los: Frist von ResponseController nicht eingehalten

Los: Frist von ResponseController nicht eingehalten

王林
王林nach vorne
2024-02-09 12:09:08839Durchsuche

Go:不遵守 ResponseController 的截止日期

php-Editor Strawberry ist hier, um Sie über „Go: Nichteinhaltung der Frist von ResponseController“ zu informieren. In der Softwareentwicklung ist ResponseController ein gängiger Controller, der zur Verarbeitung von Antwortanfragen verwendet wird. Manchmal versäumen Entwickler jedoch, beim Schreiben von Code die Deadline des ResponseControllers einzuhalten, was zu einer Reihe von Problemen führen kann. In diesem Artikel wird dieses Problem im Detail untersucht und Lösungen bereitgestellt, um die Zuverlässigkeit und Stabilität Ihres Codes sicherzustellen.

Frageninhalt

Ich habe einen Code, mit dem ich versuche, das Zurückschreiben an den Client abzubrechen, wenn das Schreiben zu lange dauert. Ich denke, ich kann http.responsecontroller verwenden, um dies zu erreichen, da es über eine setwritedeadline-Methode verfügt.

Leider gibt rw.write im folgenden Code nach Ablauf der Frist keinen Fehler zurück.

Gibt es eine andere Möglichkeit, das Schreiben abzubrechen?

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)
}
$ go run main.go 
2023/04/26 12:24:40 get /
2023/04/26 12:24:40 write deadline: 2023-04-26 12:24:43.303884739 -0700 pdt m=+11.5891
16304
2023/04/26 12:24:41 bytes written 1
2023/04/26 12:24:42 bytes written 1
2023/04/26 12:24:43 bytes written 1
2023/04/26 12:24:44 bytes written 1
2023/04/26 12:24:45 bytes written 1
2023/04/26 12:24:46 bytes written 1
2023/04/26 12:24:46 get / write total 6
$ curl http://localhost:8080/
curl: (52) Empty reply from server

Workaround

setwritedeadline-Dokumentation sagt:

setwritedeadline Legen Sie die Frist für das Schreiben von Antworten fest. Das Schreiben des Antworttexts nach Ablauf der Frist wird nicht blockiert, kann aber erfolgreich sein, wenn die Daten gepuffert werden.

Der Schreibvorgang an den Antwortschreiber in der Frage ist erfolgreich, da die kleine von der Anwendung geschriebene Datenmenge gepuffert wird.

Der Fehler „Leere Antwort vom Server“ von Curl zeigt an, dass die Frist eingehalten wird, wenn der Server die Antwort an die zugrunde liegende Netzwerkverbindung weiterleitet, wenn sie vom Handler zurückkehrt.

Verwenden Sie setwritedeadline, um die Langsamkeit des Kunden zu verhindern.

Verwenden Sie einen Kontext mit einer Frist , um die Zeit zu begrenzen, die der Server benötigt, um eine Antwort zu generieren:

65bd46fc4 Februar

Das obige ist der detaillierte Inhalt vonLos: Frist von ResponseController nicht eingehalten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen