[英]go-routines and channels in go
我正在尝试使用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数组
该代码假定从数组输入中获取值,然后将它们发送到一个函数,该函数将这些值返回到通道点中 。 该通道是全局定义的:
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
指令
var points = make(chan float64)
创建一个无缓冲通道,这反过来意味着
points <- contributions_sum(input, distance, input[i][x_ln])
将阻塞,直到从点读取另一个例程为止。
考虑到您发布的代码中的所有例程都必须先在该通道上执行发送操作,然后再读取该例程,因此它们都会阻塞等待在同一通道上进行的读取,这将永远不会发生(除非在您未执行的代码中完成了该操作) t发布,您应该拥有)。 结果,您将陷入死锁(通常会写成这个错误,是您引用控制台显示的所有内容时出错的错误吗?)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.