Maison > développement back-end > Golang > Go - Arrêter la boucle avec le contexte pour toujours

Go - Arrêter la boucle avec le contexte pour toujours

WBOY
Libérer: 2024-02-06 08:45:07
avant
349 Les gens l'ont consulté

Go - 永远停止带有上下文的循环

Contenu de la question

J'ai un processus asynchrone qui est censé durer éternellement, comme ceci :

func asyncforevertask() {
  for {
    anytask()
  }
}

func main() {
  go asyncforevertask()

  server.run(8080)
}
Copier après la connexion

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.
  }
}
Copier après la connexion

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.


Bonne réponse


Vous pouvez utiliser les canaux pour ce faire :

var stopasync = make(chan struct{})

func asyncforevertask() {
  for {
    select {
      case <-stopasync:
         return
      default:
    }
    anytask()
  }
}
Copier après la connexion

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()
  }
}
Copier après la connexion

ou :

func asyncforevertask(ctx context.context) {
  for {
    if ctx.err()!=nil {
       return
    }
    anytask()
  }
Copier après la connexion

Pour arrêter, appelez la fonction cancel renvoyée :

...
cancel()
Copier après la connexion

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!

source:stackoverflow.com
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal