Go 执行例行程序等待通道的响应并继续

Go 执行例行程序等待通道的响应并继续,go,concurrency,goroutine,Go,Concurrency,Goroutine,我正在学习go并发,我想实现一个简单的示例,从矩阵中提取行,并向每行添加一个值数组(切片) 因为我使用的是通道,所以我尝试等待每一行从goroutine获得相应的结果。然而,这并不比同步进行要好。如何使每一行等待各自的结果,并允许其他行同时计算其结果 包干管 输入“fmt” /* 数组: 0 1 2 3 4 5 6 7 8 9 + 矩阵: 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0

我正在学习go并发,我想实现一个简单的示例,从矩阵中提取行,并向每行添加一个值数组(切片)

因为我使用的是通道,所以我尝试等待每一行从goroutine获得相应的结果。然而,这并不比同步进行要好。如何使每一行等待各自的结果,并允许其他行同时计算其结果


包干管
输入“fmt”
/*
数组:
0 1 2 3 4 5 6 7 8 9
+
矩阵:
1 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 1
-> 
预期结果:
1 1 2 3 4 5 6 7 8 9
0 2 2 3 4 5 6 7 8 9
0 1 3 3 4 5 6 7 8 9
0 1 2 4 4 5 6 7 8 9
0 1 2 3 5 5 6 7 8 9
0 1 2 3 4 6 6 7 8 9
0 1 2 3 4 5 7 7 8 9
0 1 2 3 4 5 6 8 8 9
0 1 2 3 4 5 6 7 9 9
0 1 2 3 4 5 6 7 8 10
*/
func main(){
数字:=[]整数{0,1,2,3,4,5,6,7,8,9}
矩阵:=[]int{
{1,0,0,0,0,0,0,0,0,0},
{0,1,0,0,0,0,0,0,0,0},
{0,0,1,0,0,0,0,0,0,0},
{0,0,0,1,0,0,0,0,0,0},
{0,0,0,0,1,0,0,0,0,0},
{0,0,0,0,0,1,0,0,0,0},
{0,0,0,0,0,0,1,0,0,0},
{0,0,0,0,0,0,0,1,0,0},
{0,0,0,0,0,0,0,0,1,0},
{0,0,0,0,0,0,0,0,0,1},
}
rmatrix:=make([]int,10)
对于i,行:=范围矩阵{
结果:=make(chan[]int)

go func(row[]int,numbers[]int,c chan我需要使用一个
sync.WaitGroup
并直接分配调用结果(以保证它们返回到索引行)。谢谢@Peter

主程序包
进口(
“fmt”
“同步”
)
func main(){
数字:=[]整数{0,1,2,3,4,5,6,7,8,9}
矩阵:=[]int{
{1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 1, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 1, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 1, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 1, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
}
rmatrix:=make([]int,10)
var waitGroup sync.waitGroup
对于i,行:=范围矩阵{
waitGroup.Add(1)
go func(i int,第[]行int){
rmatrix[i]=addRow(行,数字)
waitGroup.Done()
}(一,世界其他地区)
}
waitGroup.Wait()
fmt.Println(rmatrix)
}
func addRow(行[]整数,数字[]整数)[]整数{
结果:=make([]整数,len(行))
对于i,e:=范围行{
结果[i]=e+数字[i]
}
返回结果
}

此示例生成的goroutine数量较少,并且无论哪个goroutine首先完成处理,都能保证正确的顺序

主程序包
进口(
“fmt”
“同步”
)
类型rowRes结构{
索引整数
结果*[]整数
}
func addRow(索引int,行[]int,数字[]int)行数{
结果:=make([]整数,len(行))
对于i,e:=范围行{
结果[i]=e+数字[i]
}
返回罗尔斯{
索引:索引,,
结果:&结果,
}
}
func main(){
数字:=[]整数{0,1,2,3,4,5,6,7,8,9}
矩阵:=[]int{
{1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 1, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 1, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 1, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 1, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
}
rmatrix:=make([]int,10)
//缓冲信道
rowChan:=make(chan rowRes,10)
wg:=sync.WaitGroup{}
//接受者路线
go recv(rowChan,rmatrix)
对于i:=范围矩阵{
工作组.添加(1)
go func(索引int,行[]int,w*sync.WaitGroup){
rowChan管道法


taskChannel:=make(chan string,1000);//设置任务队列
wg:=sync.WaitGroup
//任务发布
工作组.添加(1)
go func(工作组和任务频道){
延期工作组下
对于“任务列表”中的i{

taskChannel此代码与问题无关,不保留输入的顺序,对单个大小写使用愚蠢的select,使用bool而不是惯用的空结构,并且不首先编译。不需要通道和第二个GOROUTE。只需直接分配addRow的结果: