Maison >développement back-end >Golang >Comment arrêter une exécution de Go Goroutine après un délai d'attente ?

Comment arrêter une exécution de Go Goroutine après un délai d'attente ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-24 11:21:15180parcourir

How to Stop a Go Goroutine Execution After a Timeout?

Arrêter l'exécution de Goroutine en cas d'expiration du délai

Dans Go, les goroutines fournissent un moyen léger d'exécuter du code simultanément. Cependant, il est parfois nécessaire d'arrêter une goroutine après un laps de temps spécifique.

Problème :

Un utilisateur a rencontré un problème où une goroutine continuait à s'exécuter même après un délai d'attente. a été fixé. Ils s'attendaient à ce que la goroutine s'arrête immédiatement après avoir atteint le délai d'attente, mais à la place, elle a imprimé des messages supplémentaires. Voici un exemple de code :

type Response struct {
    data   interface{}
    status bool
}

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

    go func() {
        time.Sleep(10 * time.Second)
        fmt.Println("test")
        fmt.Println("test1")
        ch <- Response{data: "data", status: true}
    }()

    select {
    case <-ch:
        fmt.Println("Read from ch")
        res := <-ch
        return res.data, res.status
    case <-time.After(50 * time.Millisecond):
        return "Timed out", false
    }
}

Sortie attendue :

  • Expiration du délai

Sortie réelle :

  • Minuté out
  • test
  • test1

Analyse :

Le problème survient car le délai d'attente est défini du côté récepteur du canal ch, pas du côté émetteur. Bien que le délai d'attente identifie correctement qu'aucune donnée n'a été reçue dans les 50 millisecondes, il n'empêche pas la goroutine de s'exécuter davantage et d'envoyer des données sur le canal par la suite.

Solution :

Comme il n'est pas possible d'interrompre directement l'exécution d'une goroutine dans Go, des approches alternatives sont nécessaire :

  • Utilisez des canaux sans tampon, qui bloquent l'envoi et forcent la goroutine à attendre que la chaîne soit prête à recevoir.
  • Utilisez le contexte avec annulation et transmettez-le dans la goroutine. Lorsque le délai d'attente se produit, annulez le contexte, et la goroutine doit vérifier le contexte et revenir plus tôt.
  • Utilisez une technique de synchronisation personnalisée, telle qu'un mutex ou un groupe d'attente, pour contrôler l'exécution de la goroutine et garantir une terminaison en temps opportun.

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