go-routines和channel in go

时间:2017-07-15 08:37:47

标签: go concurrency channel goroutine

我试图使用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
}

* 输出是一个2D数组

代码假设从数组中获取值输入将它们发送到一个函数,该函数将值返回到通道 points 。 渠道是全球定义的:

 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 个答案:

答案 0 :(得分:2)

指令

var points = make(chan float64)

创建一个无缓冲的通道,这反过来意味着

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

将阻止,直到另一个常规例程从点读取。

考虑到您发布的代码中的所有go-routines在读取之前在通道上执行发送,它们将阻止等待在相同通道上的读取,这将永远不会发生(除非在代码中完成此操作)你没有发帖,你应该有。结果,你有一个死锁(通常写入,是你引用控制台显示的所有内容的错误?)。