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

Comment expirer gracieusement les Goroutines dans Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-19 11:56:02988parcourir

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)
}

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!

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