2017-07-15 109 views
0

我試圖使用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 
} 

* 輸出是一個二維數組

代碼設取值從數組輸入將它們發送到函數,該函數將值返回到。 信道是全局定義:

var points chan float64 

並在main()函數:

points = make(chan float64) 

但總是收到此錯誤:

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

請注意併發!=並行處理。 – Flimzy

回答

2

指令

var points = make(chan float64) 

創建這意味着

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

將阻塞,直到另一個go-routine從點讀取。

考慮到您發佈的代碼中的所有go-routines在讀取之前在通道上執行發送操作,它們將全部阻止在同一個通道上等待讀取,這種讀取永遠不會發生(除非在你沒有發佈的代碼,你應該有)。因此,你有一個死鎖(通常是寫入的,是你引用控制檯顯示的所有內容的錯誤?)。

+0

謝謝,確實是這個問題。是的,我發佈的是我在控制檯中可以看到的所有內容,每個goroutine只需多次 – Yoav2000