9
votes

Comment puis-je savoir si un goroutine est fait, sans blocage?

Tous les exemples que j'ai vus jusqu'à présent impliquent un blocage pour obtenir le résultat (via l'opérateur <- chan ).

Mon approche actuelle implique de passer un pointeur à une structure: xxx

que le goroutine écrit à la fin. Ensuite, c'est une simple question de vérifier fini chaque fois qu'il est pratique. Avez-vous de meilleures alternatives?

Que je suis vraiment visible est un système de signalisation de signal de style QT. J'ai une hunch la solution aura l'air presque triviale ( chan s ont lots de potentiel inexploré), mais je ne suis pas encore assez familier avec la langue pour le comprendre.


0 commentaires

3 Réponses :


5
votes

Sélectionner des instructions vous permet de vérifier plusieurs canaux à la fois, en prenant une branche aléatoire ( de ceux où la communication attend): xxx

pour tout l'envoi et recevoir expressions dans la déclaration "Select", Les expressions de la chaîne sont évaluées, avec des expressions qui apparaissent sur le côté droit de l'envoi expressions, dans l'ordre de haut en bas. Si l'une des opérations obtenues peut procéder, on est choisi et le communication correspondante et Les déclarations sont évaluées. Autrement, S'il y a un cas par défaut, que Exécute; Sinon, la déclaration bloque jusqu'à ce que l'une des communications puisse complet.


1 commentaires

@Jurily: Êtes-vous sûr de ça? Il devrait être correct, mais il faudrait mieux sans l'espace après <- .



13
votes

Vous pouvez utiliser le modèle "virgule, ok" "(voir leur page sur" Efficace Go "):

foo     := <- ch; // This blocks.
foo, ok := <- ch; // This returns immediately.


1 commentaires

Vous devez écrire: Sélectionnez {Case FOO: = <-CH: Par défaut:}



5
votes

Vous pouvez également jeter un coup d'œil sur le tampon de canal pour voir si elle contient quoi que ce soit à l'aide de len: xxx

Ceci ne touche pas le tampon de canal, contrairement à foo, gottvalue: = <- ch qui supprime une valeur lorsque gottvalue == true .


0 commentaires