Maison > développement back-end > Golang > Comment expirer gracieusement les Goroutines dans Go ?

Comment expirer gracieusement les Goroutines dans Go ?

Patricia Arquette
Libérer: 2024-11-19 11:56:02
original
1038 Les gens l'ont consulté

How to Gracefully Timeout Goroutines in Go?

Comment expirer les Goroutines dans Go pour contrôler le temps d'exécution

Les Goroutines, partie intégrante de la concurrence Go, permettent une exécution asynchrone des tâches. Cependant, il est parfois nécessaire de contrôler la durée de ces routines et d'empêcher leur exécution indéfiniment.

Contexte et problème

Dans votre outil de test de charge, vous souhaitez terminez les goroutines après une heure spécifiée pour limiter la durée du processus d'appel HTTP. L'approche actuelle utilisant time.Sleep() au sein d'une goroutine crée un canal de communication, mais elle entraîne l'arrêt prématuré des goroutines.

Solution utilisant le contexte

Une plus L'approche recommandée implique l'utilisation du package golang.org/x/net/context (disponible dans la bibliothèque standard de Go 1.7 ), en particulier l'interface context.Context. Le contexte fournit un mécanisme pour annuler ou expirer les goroutines.

L'extrait de code suivant illustre cette solution :

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)
}
Copier après la connexion

Dans ce code :

  • Un contexte. Le contexte est créé avec un délai d'attente de 50 millisecondes à l'aide de context.WithTimeout().
  • La goroutine test() s'exécute dans ce contexte et attend les instructions via select.
  • Une fois le délai d'attente écoulé, select reçoit le signal ctx.Done() et quitte la goroutine gracieusement, évitant ainsi une veille excessive.

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