猿问

Go例程不执行

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


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 被终止。


但是如果顺序运行代码就没有问题


我的设计模式有什么错误,我该如何纠正它。


潇湘沐
浏览 130回答 1
1回答

千万里不及你

您尝试实现的通常模式使用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在它开始的那个上面的所有表上做,所以第一个处理所有表,第二个处理除第一个以外的所有表,依此类推。这是你想要的吗?
随时随地看视频慕课网APP

相关分类

Go
我要回答