亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 160 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號