2017-07-15 1 views
0

Je suis en train de faire quelques calculs en parallèle à l'aide de la concurrence de Go:go-routines et canaux vont

func intensity_calc(input Matrix, distance float64) Matrix { 
    output := create_matrix(len(input), len(input[0])) 
    var wg sync.WaitGroup 
    reverse := len(input) 

    wg.Add(len(input)/2) 
    for i := 0; i < len(input)/2; i++ { 
     output[i][x_ln] = input[i][x_ln] 
     go func() { // creates a go-routine 
     points <- contributions_sum(input, distance, input[i][x_ln]) 
     output[i][y_ln] = <-points 
     output[reverse][y_ln] = output[i][y_ln] 
     fmt.Println(i) 
     defer wg.Done() // process is done 
    }() 
    } 
    wg.Wait() // wait until all processes are finished 
    return output 
} 

* sortie est un tableau 2D

le code suppose de prendre des valeurs à partir du tableau entrée les envoyer à une fonction qui renvoie les valeurs dans le canal points. le canal est défini globalement:

var points chan float64 

et dans la fonction principale():

points = make(chan float64) 

mais je continue à obtenir cette erreur:

goroutine 2017 [chan send]: 
main.intensity_calc.func1(0xc04206a000, 0xfa1, 0xfa1, 0x3f50624dd2f1a9fc, 0xc0420bb660, 0xc042094000, 0xfa1, 0xfa1, 0xfa1, 0xc0420bb650) 
    C:/.../go concurrent calculation.go:71 +0xbf 
created by main.intensity_calc 
    C:/.../go concurrent calculation.go:76 +0x1c0 
+1

Notez que la simultanéité! = Traitement parallèle. – Flimzy

Répondre

2

L'instruction

var points = make(chan float64) 

créer est un canal non tamponné, ce qui signifie que

points <- contributions_sum(input, distance, input[i][x_ln]) 

va bloquer jusqu'à ce qu'une autre go-routine lit de points. Considérant que tous les go-routines dans le code que vous avez posté effectuent un envoi sur le canal avant d'en lire, ils bloqueront tous l'attente d'une lecture sur le même canal qui ne se produira jamais (sauf si cela est fait dans le code que vous n'avez pas publié, que vous devriez avoir). En conséquence, vous avez un blocage (qui est généralement écrit, est l'erreur que vous avez cité tout ce que la console affiche?).

+0

merci, c'était effectivement le problème. et oui, ce que j'ai posté était tout ce que je pouvais voir dans la console, juste plusieurs fois pour chaque goroutine – Yoav2000