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

Go : délai de ResponseController non respecté

王林
Libérer: 2024-02-09 12:09:08
avant
859 Les gens l'ont consulté

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)
}
Copier après la connexion
$ 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
Copier après la connexion
$ curl http://localhost:8080/
curl: (52) Empty reply from server
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal