我试图使用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
答案 0 :(得分:2)
指令
var points = make(chan float64)
创建一个无缓冲的通道,这反过来意味着
points <- contributions_sum(input, distance, input[i][x_ln])
将阻止,直到另一个常规例程从点读取。
考虑到您发布的代码中的所有go-routines在读取之前在通道上执行发送,它们将阻止等待在相同通道上的读取,这将永远不会发生(除非在代码中完成此操作)你没有发帖,你应该有。结果,你有一个死锁(通常写入,是你引用控制台显示的所有内容的错误?)。