Maison > développement back-end > Golang > Comment annuler l'exécution d'un Go Goroutine après un timeout ?

Comment annuler l'exécution d'un Go Goroutine après un timeout ?

Susan Sarandon
Libérer: 2024-12-16 18:56:15
original
331 Les gens l'ont consulté

How to Cancel a Go Goroutine's Execution After a Timeout?

Annulation de l'exécution de Goroutine en cas d'expiration du délai

Dans les routines Go, il peut être nécessaire de mettre fin aux opérations au-delà d'un seuil de temps spécifique. Cela peut présenter des défis, car Go exécute généralement les goroutines de manière asynchrone sans contrôle direct sur leur exécution. Un scénario courant se produit lors de l'utilisation du framework iris, dans lequel vous pouvez rencontrer des situations dans lesquelles une goroutine continue de s'exécuter même après un délai d'attente.

Considérez l'extrait de code suivant :

package main

import (
    "fmt"
    "time"
)

func main() {
    Res := make(chan Response, 1)

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

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

type Response struct {
    data   interface{}
    status bool
}
Copier après la connexion

Comme illustré dans l'exemple, une goroutine est lancée pour imprimer le test après un délai de 10 secondes. Un canal (Res) est utilisé pour faciliter la communication entre la goroutine et la goroutine principale. Une instruction select est utilisée pour attendre soit une réponse de la goroutine, soit un délai d'attente de 50 millisecondes.

Cependant, le comportement attendu est que la goroutine doit être terminée dès que le délai d'attente se produit. Au lieu de cela, la sortie montre que le test est toujours imprimé même si le délai d'attente a expiré.

Cela se produit car il n'existe pas de méthode simple dans Go pour interrompre de force l'exécution d'une goroutine en cours d'exécution. Go fonctionne sur un modèle de concurrence fork-join, dans lequel une nouvelle goroutine est créée en tant que thread d'exécution distinct. Une fois créées, la planification et la gestion des goroutines deviennent une partie de la responsabilité du runtime Go.

Pour résoudre ce problème, il est recommandé d'adopter des techniques de synchronisation qui permettent un contrôle plus granulaire sur le comportement des goroutines.

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