pourquoi sortie: p> attendre: p> arrêté code> ISNT Imprimer et renvoyer le principal code> à la place?
3 Réponses :
Lorsque le boom arrive, les mousses de goroutine principales attendent d'écrire au canal d'arrêt. Mais il n'y a pas d'autres gorouts qui attendent de le lire, il s'agit donc d'une impasse. P>
Si vous faites des cesses de canal un canal tamponné avec une capacité 1, il sera capable d'écrire à elle et la prochaine itération lira. Ou simplement fermer le canal. P>
the GO Spécification de la langue de programmation dit ce qui suit sur l'envoi d'une chaîne: p >
blocs de communication jusqu'à ce que l'envoi puisse continuer. Un envoi sur un Un canal non coupé peut procéder si un récepteur est prêt. Un envoi sur un canal tamponné peut procéder s'il y a de la place dans le tampon. P> blockQuote>
Alors, lorsque votre code passe à
Stop <- 0 Code> Il bloque l'attente d'une autre goroutine à lire à partir du canal et que cela ne se produit jamais (votre<- Stop: code> est dans la même routine de la même manière n'est pas active). P>Il y a quelques façons que vous pouvez résoudre ce problème: p>
- Utilisez un canal tampon (E.G.
Stop: = CARE (Chan Int, 1) Code>). LI>- Attendez l'arrêt dans une autre routine Go ( exemple ) li>
- Fermez la chaîne au lieu d'envoyer quelque chose à celui-ci (
fermeture (arrêt) code>). Li> ol>Remarque: En raison de la façon dont votre application est écrite, aucune de ces options ne l'empêchera de l'arrêter de ne jamais quitter la boucle (ajoutez un
break code> ouretour code> pour quitter) . p>
"Si un récepteur est prêt" signifie fondamentalement que l'envoi peut procéder lorsqu'un autre goroutine tente de recevoir du canal (par exemple via <- stop code>).
Je devrais ajouter que le SPEC dit "Un canal fournit un mécanisme pour exécuter simultanément des fonctions pour communiquer par Envoi et réception de valeurs d'un type d'élément spécifié ". Dans votre programme, vous avez 3 routines GO (MAIN, ONE COMMENCÉE PAR TIME.TICK ET UNE COMMENCÉE À TIME.Après). Comme votre Stop CODE> n'est utilisée que dans la routine principale (et, en tant que telle, seulement communiquer avec lui-même), vous n'avez pas besoin d'un canal pour cela; Voir ce Mise en œuvre alternative .
@jiburiru Cela fonctionne.
tick.
.
.
tick.
.
.
tick.
.
.
tick.
BOOM!
Stopped!