Go例程不执行
Go routines not executing
以下是给我带来问题的代码。我想要实现的是并行创建那么多 table。创建完所有 table 后,我想退出这些函数。
func someFunction(){
....
gos := 5
proc := make(chan bool, gos)
allDone := make(chan bool)
for i:=0; i<gos; i++ {
go func() {
for j:=i; j<len(tables); j+=gos {
r, err := db.Exec(tables[j])
fmt.Println(r)
if err != nil {
methods.CheckErr(err, err.Error())
}
}
proc <- true
}()
}
go func() {
for i:=0; i<gos; i++{
<-proc
}
allDone <- true
}()
for {
select {
case <-allDone:
return
}
}
}
我正在创建两个通道 1 以跟踪创建的 table 数量 (proc) 和其他通道 (allDone) 以查看是否全部完成。
当我 运行 这段代码然后创建 table 的 go 例程开始执行但在它完成之前 someFunction 被终止。
但是如果运行代码顺序是没有问题的
我的设计模式有什么错误,我该如何改正。
您要实现的目标的常用模式使用 WaitGroup
。
我认为你面临的问题是 i
被每个 goroutine 捕获并且它不断地被外循环递增。您的内循环从 i
开始,并且由于外循环继续,每个 goroutine 从 5.
开始
尝试将迭代器作为参数传递给 goroutine,以便每次都能获得一个新副本。
func someFunction(){
....
gos := 5
var wg sync.WaitGroup
wg.Add(gos)
for i:=0; i< gos; i++ {
go func(n int) {
defer wg.Done()
for j:=n; j<len(tables); j+=gos {
r, err := db.Exec(tables[j])
fmt.Println(r)
if err != nil {
methods.CheckErr(err, err.Error())
}
}
}(i)
}
wg.Wait();
}
我不确定你想在这里实现什么,每个 goroutine 都在它开始的那个上面的所有表上做 db.Exec
所以第一个处理所有表,第二个处理除了第一个以外的所有,依此类推。这是你想要的吗?
以下是给我带来问题的代码。我想要实现的是并行创建那么多 table。创建完所有 table 后,我想退出这些函数。
func someFunction(){
....
gos := 5
proc := make(chan bool, gos)
allDone := make(chan bool)
for i:=0; i<gos; i++ {
go func() {
for j:=i; j<len(tables); j+=gos {
r, err := db.Exec(tables[j])
fmt.Println(r)
if err != nil {
methods.CheckErr(err, err.Error())
}
}
proc <- true
}()
}
go func() {
for i:=0; i<gos; i++{
<-proc
}
allDone <- true
}()
for {
select {
case <-allDone:
return
}
}
}
我正在创建两个通道 1 以跟踪创建的 table 数量 (proc) 和其他通道 (allDone) 以查看是否全部完成。
当我 运行 这段代码然后创建 table 的 go 例程开始执行但在它完成之前 someFunction 被终止。
但是如果运行代码顺序是没有问题的
我的设计模式有什么错误,我该如何改正。
您要实现的目标的常用模式使用 WaitGroup
。
我认为你面临的问题是 i
被每个 goroutine 捕获并且它不断地被外循环递增。您的内循环从 i
开始,并且由于外循环继续,每个 goroutine 从 5.
尝试将迭代器作为参数传递给 goroutine,以便每次都能获得一个新副本。
func someFunction(){
....
gos := 5
var wg sync.WaitGroup
wg.Add(gos)
for i:=0; i< gos; i++ {
go func(n int) {
defer wg.Done()
for j:=n; j<len(tables); j+=gos {
r, err := db.Exec(tables[j])
fmt.Println(r)
if err != nil {
methods.CheckErr(err, err.Error())
}
}
}(i)
}
wg.Wait();
}
我不确定你想在这里实现什么,每个 goroutine 都在它开始的那个上面的所有表上做 db.Exec
所以第一个处理所有表,第二个处理除了第一个以外的所有,依此类推。这是你想要的吗?