3 回答

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超8個(gè)贊
無(wú)法保證 goroutine 的順序。根據(jù)您的觀察,看起來(lái)在寫(xiě)入通道后,主 goroutine 繼續(xù)并將活動(dòng)的 goroutine 打印為兩個(gè),然后squares
goroutine 運(yùn)行并完成。
您也有可能從第一次調(diào)用中得到 1 來(lái)獲取 goroutine 的數(shù)量。如果squares
goroutine 在主 goroutine 寫(xiě)入通道后立即運(yùn)行,就會(huì)發(fā)生這種情況。您可以通過(guò)在寫(xiě)入通道之后但在獲取 goroutine 數(shù)量之前添加睡眠調(diào)用來(lái)強(qiáng)制執(zhí)行此操作。

TA貢獻(xiàn)1833條經(jīng)驗(yàn) 獲得超4個(gè)贊
您的第二個(gè) goroutine 接收 4 個(gè)值,打印它們并squares
幾乎立即退出(返回時(shí))。你很幸運(yùn),它在第一次調(diào)用時(shí)仍在運(yùn)行NumGoRoutines
。
順便說(shuō)一句,我建議您閱讀有關(guān)該語(yǔ)言的信息,而不是通過(guò)實(shí)驗(yàn)來(lái)學(xué)習(xí)。僅僅因?yàn)槟承〇|西在您嘗試時(shí)有效,并不意味著它是正確的方法并且總是有效的,尤其是在涉及并發(fā)的情況下?;蛘撸褂酶?jìng)爭(zhēng)檢測(cè)器顯示任何數(shù)據(jù)競(jìng)爭(zhēng)。

TA貢獻(xiàn)1909條經(jīng)驗(yàn) 獲得超7個(gè)贊
讓我強(qiáng)制執(zhí)行排序,這樣你甚至不需要計(jì)算 goroutine 的數(shù)量,試試這個(gè):
package main
import (
"fmt"
"runtime"
"sync"
)
func main() {
var wg sync.WaitGroup
ch := make(chan int)
wg.Add(1)
go func() {
defer wg.Done()
for n := range ch {
fmt.Println(n)
}
}()
ch <- 1
ch <- 2
ch <- 3
ch <- 4
fmt.Println("NumGoroutine =", runtime.NumGoroutine()) // 2
close(ch)
wg.Wait()
fmt.Println("NumGoroutine =", runtime.NumGoroutine()) // 1
}
輸出:
1
2
3
NumGoroutine = 2
4
NumGoroutine = 1
筆記:
使用無(wú)緩沖通道強(qiáng)制寫(xiě)入通道和從通道讀取的一對(duì)一同步。
顯式關(guān)閉通道以退出for循環(huán)。
顯式使用wg.Done()表示 goroutine 的結(jié)束,所以wg.Wait()等待它。
讓我先展開(kāi)循環(huán)for:
func squares(c chan int) {
num := <-c
fmt.Println(num * num)
num = <-c
fmt.Println(num * num)
num = <-c
fmt.Println(num * num)
num = <-c
fmt.Println(num * num)
}
func main() {
c := make(chan int, 3)
go squares(c)
c <- 1
c <- 2
c <- 3
c <- 4
fmt.Println("NumGoroutine =", runtime.NumGoroutine())
time.Sleep(100 * time.Millisecond)
fmt.Println("NumGoroutine =", runtime.NumGoroutine())
}
現(xiàn)在讓我們運(yùn)行它:
由于您使用的是 3 的緩沖通道,因此這 3 行運(yùn)行速度很快(這意味著無(wú)需等待通道同步 - 只需附加1, 2, 3到通道的緩沖區(qū)):
c <- 1
c <- 2
c <- 3
并且根據(jù)操作系統(tǒng)和 CPU 負(fù)載,消費(fèi)者 goroutine 可能會(huì)全部消耗或不消耗它們,
此時(shí)c <- 4,我們有兩種情況:
通道已滿(mǎn):所以maingoroutine 等待通道同步。
通道有一個(gè)(或多個(gè))空閑位置:因此c <- 4運(yùn)行速度很快,只是將4通道的緩沖區(qū)放入(無(wú)需等待通道同步)。
現(xiàn)在,在這c <- 4一點(diǎn)之后,我們也有兩種情況:
另一個(gè) goroutine 使用4并退出,所以我們只有一個(gè) maingoroutine。
另一個(gè) goroutine不消耗4,所以我們有兩個(gè)goroutine。
- 3 回答
- 0 關(guān)注
- 112 瀏覽
添加回答
舉報(bào)