2017-07-15 9 views
0

Ich versuche, ein paar Berechnungen parallel mit Gos Gleichzeitigkeit auszuführen:Go-Routinen und Kanäle in go

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 
} 

* Ausgang ist ein 2D-Array

die Codewerte nehmen vermutet aus dem Array Eingang senden Sie sie an eine Funktion, die die Werte in den Kanal Punkte zurückgibt. der Kanal global definiert:

var points chan float64 

und in der Funktion main():

points = make(chan float64) 

aber ich erhalte diesen Fehler:

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

Beachten Sie, dass Nebenläufigkeit! = Parallelverarbeitung. – Flimzy

Antwort

2

Die Anweisung

var points = make(chan float64) 

erstellen s ein ungepufferte Kanal, was wiederum bedeutet, dass

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

blockiert, bis ein anderer Startroutine von Punkten einliest.

In Anbetracht der Tatsache, dass alle Go-Routinen in dem Code, den Sie gepostet haben, einen Send auf dem Kanal vor dem Lesen ausführen, blockieren alle auf einen Lesevorgang auf dem gleichen Kanal, der nie passieren wird (es sei denn, dies geschieht in der Code, den du nicht gepostet hast, was du haben solltest). Als Ergebnis haben Sie einen Deadlock (der normalerweise geschrieben wird, ist der Fehler, den Sie zitiert haben, alles, was die Konsole anzeigt?).

+0

danke, das war in der Tat das Problem. und ja, was ich gepostet habe, war alles, was ich in der Konsole sehen konnte, nur mehrmals für jede Goroutine – Yoav2000