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
WBOYavant
2024-02-06 08:45:07336parcourir

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)
}

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.


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()
  }
}

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer