第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

帶有活動(dòng) goroutine 數(shù)量的奇怪輸出

帶有活動(dòng) goroutine 數(shù)量的奇怪輸出

Go
絕地?zé)o雙 2022-06-27 16:22:07
我試圖通過(guò)運(yùn)行小程序來(lái)學(xué)習(xí)頻道。我不明白下面的程序,因?yàn)樗o出了一個(gè)奇怪的輸出:func squares(c chan int) {    for i := 0; i < 4; i++ {        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(runtime.NumGoroutine())    time.Sleep(time.Second)    fmt.Println(runtime.NumGoroutine())}在執(zhí)行這個(gè)程序時(shí),我看到第一次它打印活動(dòng) goroutine 的數(shù)量為 2。然后一秒鐘后,它的輸出為 1。這真的很奇怪??戳藥灼┛停瑳](méi)看懂。那么,在 goroutine 停止工作的那一秒內(nèi),究竟發(fā)生了什么變化?
查看完整描述

3 回答

?
慕的地10843

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超8個(gè)贊

無(wú)法保證 goroutine 的順序。根據(jù)您的觀察,看起來(lái)在寫(xiě)入通道后,主 goroutine 繼續(xù)并將活動(dòng)的 goroutine 打印為兩個(gè),然后squaresgoroutine 運(yùn)行并完成。

您也有可能從第一次調(diào)用中得到 1 來(lái)獲取 goroutine 的數(shù)量。如果squaresgoroutine 在主 goroutine 寫(xiě)入通道后立即運(yùn)行,就會(huì)發(fā)生這種情況。您可以通過(guò)在寫(xiě)入通道之后但在獲取 goroutine 數(shù)量之前添加睡眠調(diào)用來(lái)強(qiáng)制執(zhí)行此操作。


查看完整回答
反對(duì) 回復(fù) 2022-06-27
?
瀟瀟雨雨

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)。


查看完整回答
反對(duì) 回復(fù) 2022-06-27
?
jeck貓

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。


查看完整回答
反對(duì) 回復(fù) 2022-06-27
  • 3 回答
  • 0 關(guān)注
  • 112 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)