gpt4 book ai didi

Go例程不执行

转载 作者:IT王子 更新时间:2023-10-29 01:56:44 25 4
gpt4 key购买 nike

以下是给我带来问题的代码。我想要实现的是并行创建那么多表。创建所有表后,我想退出函数。

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
}
}
}

我正在创建两个 channel 1 以跟踪创建的表数 (proc) 和其他 channel (allDone) 以查看是否全部完成。

当我运行这段代码时,创建表的 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 所以第一个处理所有表,第二个处理除第一个以外的所有内容,依此类推。这是你想要的吗?

关于Go例程不执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52802310/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com