tous les goroutines sont endormis - blocage
Pour l'un de mes exigence-je créer un nombre N de travailleur à aller routines, qui seront suivis par une surveillance de routine. la surveillance de routine a la fin, lorsque tous les travailleurs routines complète. Mon code se terminant en impasse, s'il vous plaît aider.
import "fmt"
import "sync"
import "strconv"
func worker(wg *sync.WaitGroup, cs chan string, i int ){
defer wg.Done()
cs<-"worker"+strconv.Itoa(i)
}
func monitorWorker(wg *sync.WaitGroup, cs chan string) {
defer wg.Done()
for i:= range cs {
fmt.Println(i)
}
}
func main() {
wg := &sync.WaitGroup{}
cs := make(chan string)
for i:=0;i<10;i++{
wg.Add(1)
go worker(wg,cs,i)
}
wg.Add(1)
go monitorWorker(wg,cs)
wg.Wait()
}
OriginalL'auteur vrbilgi | 2013-11-10
Vous devez vous connecter pour publier un commentaire.
Votre monitorWorker ne meurt jamais. Lorsque tous les travailleurs de la finition, il continue à attendre sur les cs. Cette blocages parce que rien d'autre ne sera jamais envoyer de la cs et, par conséquent, wg ne sera jamais atteindre 0. Une solution possible est d'avoir le moniteur fermer le canal lorsque tous les travailleurs de finition. Si la boucle est en principal, ce sera la fin de la boucle, le retour de la principale, et la fin du programme.
Par exemple: http://play.golang.org/p/nai7XtTMfr
Edit: C'est une réponse à l'OP du premier commentaire.
Votre programme comporte trois parties qui doivent se synchroniser. Tout d'abord, l'ensemble de vos travailleurs ont besoin pour envoyer les données. Ensuite, votre impression de boucle besoin d'imprimer des données. Ensuite, votre principale fonction doit retourner mettant ainsi fin au programme. Dans votre exemple, tous les travailleurs envoyer les données, toutes les données sont imprimées, mais le message n'est jamais envoyé au principal qu'il devrait revenir normalement.
Dans mon exemple, le principal de l'impression et de la "monitorWorker" juste dit principal quand il a reçu chaque morceau de données dont il a besoin pour imprimer. De cette façon, le programme se termine normalement et pas en impasse.
Si vous insistez sur la boucle d'impression d'être dans un autre goroutine, vous pouvez le faire. Mais alors un supplément de communication doit être envoyé aux principaux afin qu'il renvoie. Dans cet exemple, j'utilise un canal pour assurer principale se termine lorsque toutes les données sont imprimées.
J'ai commenté dans la réponse.
J'ai essayé différentes variantes, Mais votre réponse est simple et élégant.thk:D
OriginalL'auteur Stephen Weinberg