Maison >développement back-end >Golang >Comment arrêter gracieusement les Goroutines après un temps défini en utilisant le contexte ?

Comment arrêter gracieusement les Goroutines après un temps défini en utilisant le contexte ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-20 14:48:18832parcourir

How to Gracefully Stop Goroutines After a Set Time Using Context?

Comment arrêter les Goroutines après une durée spécifiée en utilisant le contexte

Contexte du problème

Dans les tests de charge, où de nombreux appels HTTP sont orchestrés dans les goroutines, cela devient crucial pour contrôler la durée d’exécution de ces routines. Cela permet aux utilisateurs de terminer le test de charge à une heure prédéfinie.

Une approche qui a échoué

Une tentative courante pour y parvenir consiste à utiliser des goroutines pour surveiller les durées de time.Sleep() et diffuser les signaux de fin. via les canaux. Bien que cette méthode puisse suffire dans certains cas, elle échoue lorsque les goroutines continuent d'effectuer des appels HTTP en dehors de la goroutine principale.

La solution : utiliser des contextes

Go 1.7 introduit le package de contexte essentiel pour résoudre ce problème. . Les contextes fournissent un moyen structuré d'annuler et de surveiller l'exécution des goroutines, offrant une solution fiable pour la terminaison temporelle.

package main

import (
    "context"
    "fmt"
    "time"
)

func test(ctx context.Context) {
    t := time.Now()

    select {
    case <-time.After(1 * time.Second):
        fmt.Println("overslept")
    case <-ctx.Done():
    }
    fmt.Println("used:", time.Since(t))
}

func main() {
    ctx, _ := context.WithTimeout(context.Background(), 50*time.Millisecond)
    test(ctx)
}

Explication :

  1. À l'intérieur de la fonction de test, un contexte avec un délai d'attente de 50 millisecondes est créé.
  2. Une instruction select vérifie si le canal time.After a un événement (indiquant la fin de la mise en veille) ou si le le contexte a été annulé.
  3. Lorsque le contexte expire, l'instruction select se termine, indiquant que la goroutine a été annulée.

Cette approche garantit que les goroutines sont annulées à l'heure spécifiée est passé, quel que soit leur emplacement dans le code.

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