我正在嘗試向數(shù)據(jù)庫發(fā)出多個(gè)請求,我發(fā)現(xiàn)同步執(zhí)行這些請求非常慢,并且在等待每個(gè)請求完成時(shí)響應(yīng)時(shí)間呈指數(shù)增長,這就是我到目前為止所擁有的:var wg sync.WaitGroupdbUsername := make(chan string, 1)dbEmail := make(chan string, 1)wg.Add(2)go func(username chan string, waiter sync.WaitGroup) { defer waiter.Done() err = db.QueryRow("SELECT username FROM user WHERE username = ?", vals.Get("username")).Scan(&result) if err != nil { log.Println(err) }}(dbUsername, wg)go func(email chan string, waiter sync.WaitGroup) { defer waiter.Done() err = db.QueryRow("SELECT email FROM user WHERE email = ?", vals.Get("email")).Scan(&result) if err != nil { log.Println(err) }}(dbEmail, wg)wg.Wait()if <-dbUsername != "" { formErrors = append(formErrors, "Username has already been taken.")}if <-dbEmail != "" { formErrors = append(formErrors, "Email has already been taken.")}但它似乎無法正常工作,我已經(jīng)按照WaitGroup示例進(jìn)行了操作,但它似乎仍然存在wg.Wait(),我不確定為什么。有沒有更漂亮的方法來做到這一點(diǎn),還是我模擬的正常?還有一個(gè)小問題:是否可以聲明一個(gè)緩沖通道,var例如var blah chan string 1
1 回答

紅糖糍粑
TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超6個(gè)贊
您正在將您的副本傳遞WaitGroup
給您的兩個(gè)函數(shù),
而是傳入一個(gè)指針, waiter *sync.WaitGroup
,因此您在 WaitGroup 上等待的代碼和 goroutine 都在同一個(gè) WaitGroup 上運(yùn)行。
這也在文檔中注明:
不應(yīng)復(fù)制包含在此包中定義的類型的值。
但是,在您的情況下,您的 goroutine 函數(shù)可以訪問在外部作用域中聲明的變量,因此您根本不需要傳入任何參數(shù)。您可能也不需要 WaitGroup,因?yàn)榻邮?code><-dbUsername 并且<-dbEmail
無論如何都會(huì)等到 goroutine 完成 - 只要您讓您的兩個(gè) goroutine 在各自的通道上發(fā)送一個(gè)值。而且您也不需要這里的緩沖通道。
至于這個(gè):
是否可以使用 var 聲明緩沖通道,例如 var blah chan string 1
是的,請記住需要使用創(chuàng)建頻道 make()
var blah chan string blah = make(chan string, 1)
或者 var blah chan string = make(chan string, 1)
- 1 回答
- 0 關(guān)注
- 186 瀏覽
添加回答
舉報(bào)
0/150
提交
取消