为了账号安全,请及时绑定邮箱和手机立即绑定

Go例程不执行

Go例程不执行

Go
潇湘沐 2023-04-24 16:06:35
以下是给我带来问题的代码。我想要实现的是并行创建那么多表。创建所有表后,我想退出函数。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 以跟踪创建的表数 (proc) 和其他通道 (allDone) 以查看是否全部完成。当我运行这段代码时,创建表的 go 例程开始执行,但在它完成之前 someFunction 被终止。但是如果顺序运行代码就没有问题我的设计模式有什么错误,我该如何纠正它。
查看完整描述

1 回答

?
千万里不及你

TA贡献1784条经验 获得超9个赞

您尝试实现的通常模式使用WaitGroup.

我认为您面临的问题是i每个 goroutine 都捕获了它,并且它不断被外循环增加。您的内循环从 5 开始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();     

}

我不确定你想在这里实现什么,每个 goroutinedb.Exec在它开始的那个上面的所有表上做,所以第一个处理所有表,第二个处理除第一个以外的所有表,依此类推。这是你想要的吗?


查看完整回答
反对 回复 2023-04-24
  • 1 回答
  • 0 关注
  • 129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信