Maison > développement back-end > Golang > Comment puis-je annuler efficacement les requêtes HTTP dans Go lorsqu'un délai d'attente se produit ?

Comment puis-je annuler efficacement les requêtes HTTP dans Go lorsqu'un délai d'attente se produit ?

Patricia Arquette
Libérer: 2024-10-29 18:11:04
original
892 Les gens l'ont consulté

How can I effectively cancel HTTP requests in Go when a timeout occurs?

Comprendre le délai d'attente de Goroutine

Dans le code que vous avez fourni, vous avez implémenté un mécanisme de délai d'attente à l'aide d'une instruction select pour gérer soit le résultat de la fonction findCicCode(), soit un délai d'attente. de 50 millisecondes. Cependant, vous avez exprimé des inquiétudes quant au risque de fuite de ressources si les appels HTTP continuent de s'exécuter même après l'expiration du délai.

Utilisation du contexte pour l'annulation des requêtes HTTP

Pour résoudre ce problème, vous pouvez exploiter le notion de contexte dans Go. Le contexte fournit un moyen d'associer des valeurs spécifiques au contexte aux goroutines et permet l'annulation. Avec le contexte, vous pouvez annuler les appels HTTP en cours lorsqu'un délai d'attente se produit.

Voici un exemple de la façon dont vous pouvez implémenter l'annulation du contexte pour les requêtes HTTP :

<code class="go">package main

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

type Response struct {
    data   interface{}
    status bool
}

func Find() (interface{}, bool) {
    ch := make(chan Response, 1)

    ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    defer cancel() // Ensure cancelation when the function exits

    go func() {
        data, status := findCicCode(ctx)
        ch <- Response{data: data, status: status}
    }()

    select {
    case response := <-ch:
        return response.data, response.status
    case <-time.After(50 * time.Millisecond):
        return "Request timed out", false
    }
}

func main() {
    data, timedOut := Find()
    fmt.Println(data, timedOut)
}</code>
Copier après la connexion

Dans ce code modifié :

  • Un contexte.Context est créé avec une fonction d'annulation.
  • La fonction findCicCode() reçoit le ctx pour annuler les requêtes en cours si le délai d'attente se produit.
  • Chacun La requête HTTP créée dans la fonction findCicCode() se voit attribuer le ctx à l'aide de req.WithContext(ctx).
  • Si le délai d'attente se produit, la fonction d'annulation est appelée, ce qui à son tour annule toutes les requêtes HTTP en cours associées au ctx. .

En utilisant cette approche, vous vous assurez que toutes les requêtes HTTP en cours sont annulées lorsque le délai d'attente est atteint, évitant ainsi une consommation inutile de ressources.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal