Maison > développement back-end > Golang > Comment obtenir des réponses HTTP en streaming et désactiver la mise en mémoire tampon dans Go ?

Comment obtenir des réponses HTTP en streaming et désactiver la mise en mémoire tampon dans Go ?

DDD
Libérer: 2024-12-24 02:58:10
original
335 Les gens l'ont consulté

How to Achieve Streaming HTTP Responses and Disable Buffering in Go?

Streaming des réponses HTTP dans Go : désactiver la mise en mémoire tampon dans http.ResponseWriter

Le streaming des réponses HTTP permet d'envoyer des données au client de manière incrémentielle, plutôt que d'attendre que la totalité de la demande soit traitée. Cette approche améliore l'expérience utilisateur en fournissant un retour immédiat et en réduisant la latence perçue. Dans Go, l'interface http.ResponseWriter est chargée d'envoyer les réponses au client. Cependant, par défaut, il met les données en mémoire tampon jusqu'à ce que la requête soit terminée.

Solution : utiliser l'interface Flusher

Pour désactiver la mise en mémoire tampon et diffuser les réponses, nous pouvons exploiter le Flusher interface implémentée par certains types ResponseWriter. L'interface Flusher nous permet de vider manuellement toutes les données mises en mémoire tampon vers le client.

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

func handle(res http.ResponseWriter, req *http.Request) {
    fmt.Fprintf(res, "sending first line of data")

    // Check if ResponseWriter implements Flusher interface
    if f, ok := res.(http.Flusher); ok {
        f.Flush()
    } else {
        log.Println("Damn, no flush")
    }

    time.Sleep(10 * time.Second) // Simulate a delay

    fmt.Fprintf(res, "sending second line of data")
}
Copier après la connexion

En incorporant l'interface Flusher, nous pouvons explicitement vider les données mises en mémoire tampon après avoir écrit chaque morceau de la réponse. Cela garantit que les données sont envoyées immédiatement au client, ce qui entraîne une réponse en continu.

Solution alternative : détourner la connexion

Une autre approche consiste à détourner le TCP sous-jacent. connexion de la requête HTTP. Cela permet une interaction directe avec le socket et une personnalisation du processus de transfert de données, y compris la désactivation de la mise en mémoire tampon. Cependant, cette approche est plus complexe et nécessite une compréhension plus approfondie de la couche réseau sous-jacente.

Autoflushing : pas une fonctionnalité intégrée

Malheureusement, le http.ResponseWriter de Go ne fournit pas de fonction de rinçage automatique. Cela signifie que le développeur est responsable de vider manuellement les données si nécessaire. Cependant, certains frameworks ou bibliothèques tierces peuvent offrir des fonctionnalités de rinçage automatique.

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:php.cn
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