Maison >développement back-end >Golang >Go : délai de ResponseController non respecté

Go : délai de ResponseController non respecté

王林
王林avant
2024-02-09 12:09:08839parcourir

Go:不遵守 ResponseController 的截止日期

l'éditeur php Strawberry est là pour vous présenter "Go : Non-respect du délai de ResponseController". Dans le développement de logiciels, ResponseController est un contrôleur courant utilisé pour gérer les demandes de réponse. Cependant, les développeurs peuvent parfois négliger de respecter le délai fixé par ResponseController lors de l'écriture du code, ce qui peut entraîner une série de problèmes. Cet article explorera ce problème en détail et fournira des solutions pour garantir la fiabilité et la stabilité de votre code.

Contenu de la question

J'ai un code dans lequel j'essaie d'annuler l'écriture au client si l'écriture prend trop de temps. Je pense que je peux utiliser http.responsecontroller pour y parvenir car il dispose d'une méthode setwritedeadline.

Malheureusement, dans le code ci-dessous, rw.write ne renvoie pas d'erreur une fois le délai écoulé.

Existe-t-il un autre moyen d'annuler l'écriture ?

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 documentation dit :

setwritedeadline Fixez la date limite pour rédiger les réponses. L'écriture du corps de la réponse après la date limite ne bloquera pas, mais peut réussir si les données sont mises en mémoire tampon.

L'écriture vers l'auteur de la réponse dans la question réussit car la petite quantité de données écrites par l'application est mise en mémoire tampon.

L'erreur "Réponse vide du serveur" de curl indique que le délai est respecté lorsque le serveur vide la réponse à la connexion réseau sous-jacente lorsqu'elle revient du gestionnaire.

Utilisez setwritedeadline pour éviter la lenteur du client.

Utilisez un contexte avec une date limite pour limiter le temps nécessaire au serveur pour générer une réponse :

65bd46fc4 février

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer