【问题标题】:Go routines not executingGo 例程未执行
【发布时间】:2018-10-14 21:38:33
【问题描述】:

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

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

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

我的设计模式中的错误是什么以及如何纠正它。

【问题讨论】:

    标签: go goroutine go-sqlite3


    【解决方案1】:

    您尝试实现的通常模式使用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,所以第一个处理所有表,第二个处理除第一个之外的所有表一个等等。这是你想要的吗?

    【讨论】:

    • 我对等待组做了同样的事情。但它仍然不起作用。在这两种情况下, r 都不会被打印,而是会在调用 someFunction 后打印。只有在顺序运行时才会打印。
    • 我看到你在检查错误之前打印了r。会不会是您总是遇到错误,因此没有r
    • 我想我现在看到了你的问题,稍等我会更新答案。
    猜你喜欢
    • 2017-12-06
    • 1970-01-01
    • 2020-01-02
    • 2023-03-12
    • 2017-05-18
    • 1970-01-01
    • 2022-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多