go-routines 和 channels in go
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
}
* 输出是一个二维数组
代码假设从数组中获取值 input 将它们发送到一个函数,该函数 returns 将值输入通道 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
说明
var points = make(chan float64)
创建一个无缓冲通道,这反过来意味着
points <- contributions_sum(input, distance, input[i][x_ln])
将阻塞直到另一个 go-routine 从点读取。
考虑到您 post 编写的代码中的所有 go-routines 在读取之前在通道上执行发送,它们将全部阻塞等待在同一通道上读取,这永远不会发生 (除非这是在你没有 post 的代码中完成的,你应该有)。结果,您遇到了死锁(通常是这样写的,您引用的错误是控制台显示的所有内容吗?)。
我正在尝试 运行 使用 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
}
* 输出是一个二维数组
代码假设从数组中获取值 input 将它们发送到一个函数,该函数 returns 将值输入通道 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
说明
var points = make(chan float64)
创建一个无缓冲通道,这反过来意味着
points <- contributions_sum(input, distance, input[i][x_ln])
将阻塞直到另一个 go-routine 从点读取。
考虑到您 post 编写的代码中的所有 go-routines 在读取之前在通道上执行发送,它们将全部阻塞等待在同一通道上读取,这永远不会发生 (除非这是在你没有 post 的代码中完成的,你应该有)。结果,您遇到了死锁(通常是这样写的,您引用的错误是控制台显示的所有内容吗?)。