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 :
Sortie réelle :
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 :
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!