Maison >développement back-end >Golang >Comment puis-je arrêter correctement l'exécution d'une Goroutine après un délai d'attente en Go ?
Arrêter l'exécution de Goroutine avec des délais d'attente dans Go
Lorsque vous tentez de mettre fin à l'exécution de Goroutine après un délai d'attente, cela peut sembler inefficace. En effet, le modèle de concurrence de Go fonctionne sur le principe de fork-join, dans lequel le lancement d'une goroutine (fork) ne fournit pas de contrôle immédiat sur son exécution. Le contrôle n'est repris qu'aux points de synchronisation, tels que la communication du canal.
Dans l'exemple donné :
go func() { time.Sleep(10 * time.Second) fmt.Println("test") fmt.Println("test1") ch <- Response{data: "data", status: true} }()
La goroutine continue son exécution malgré le délai d'attente défini dans :
case <-time.After(50 * time.Millisecond): return "Timed out", false
En effet, le délai d'attente concerne le récepteur (lecteur) du canal, pas l'expéditeur. Comme le canal est mis en mémoire tampon, l'expéditeur peut continuer à s'exécuter sans interruption.
Pour obtenir le comportement souhaité, des techniques de synchronisation doivent être utilisées. Par exemple, le canal pourrait être fermé après expiration du délai pour empêcher toute communication ultérieure :
select { case <-ch: fmt.Println("Read from ch") res := <-ch return res.data, res.status case <-time.After(50 * time.Millisecond): close(ch) return "Timed out", false }
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!