Maison >développement back-end >Golang >Go - Arrêter la boucle avec le contexte pour toujours
J'ai un processus asynchrone qui est censé durer éternellement, comme ceci :
func asyncforevertask() { for { anytask() } } func main() { go asyncforevertask() server.run(8080) }
Je veux pouvoir arrêter cette boucle for lorsqu'une certaine requête atteint le serveur.
Je sais que je dois utiliser context.withcancel()
mais je ne sais pas comment l'intégrer pour que cela fonctionne. Je connais la syntaxe suivante :
for { select { case <-ctx.Done: return case <-otherCh: // do smh. } }
Mais asyncforevertask
n'est pas géré par un signal provenant d'un autre endroit, mais il fonctionne pour toujours. Je suis un débutant et toute forme d'aide est grandement appréciée.
Vous pouvez utiliser les canaux pour ce faire :
var stopasync = make(chan struct{}) func asyncforevertask() { for { select { case <-stopasync: return default: } anytask() } }
Pour annuler, fermez simplement la chaîne. Vous devez vous assurer que la chaîne n'est fermée qu'une seule fois, sinon vous allez paniquer.
Vous pouvez également le faire via le contexte :
func main() { ctx,cancel:=context.withcancel(context.background()) go asyncforevertask(ctx) ... } func asyncforevertask(ctx context.context) { for { select { case <-ctx.done(): return default: } anytask() } }
ou :
func asyncforevertask(ctx context.context) { for { if ctx.err()!=nil { return } anytask() }
Pour arrêter, appelez la fonction cancel
renvoyée :
... cancel()
Si vous devez également vous arrêter anytask
, vous devez toujours vérifier la fermeture du canal ou du contexte et revenir de la tâche.
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!