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 ?

Comment puis-je arrêter correctement l'exécution d'une Goroutine après un délai d'attente en Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-11 21:30:12969parcourir

How Can I Properly Stop a Goroutine's Execution After a Timeout in 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!

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