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

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

為什么這里有通道的可變輸出

為什么這里有通道的可變輸出

Go
慕萊塢森 2023-07-10 15:04:42
我創(chuàng)建 5 個(gè)通道并發(fā)送數(shù)據(jù) 5 次:package mainimport "fmt"func greet(c chan string) {? ? fmt.Println("Hello " + <-c + "!")}func main() {? ? fmt.Println("main() started")? ? c := make(chan string)? ? for i:=0; i<5; i++ {? ? ? ? go greet(c)? ? }? ? c <- "AAA"? ? c <- "BBB"? ? c <- "CCC"? ? c <- "DDD"? ? c <- "EEE"? ? fmt.Println("main() stopped")}我預(yù)計(jì)所有 5 個(gè)字符串都會(huì)被打印出來(lái)。但是,我發(fā)現(xiàn)輸出可變。一些輸出是:$ ./rnchannelmain() startedHello AAA!Hello DDD!Hello BBB!Hello CCC!Hello EEE!main() stopped$ ./rnchannelmain() startedHello CCC!Hello DDD!main() stopped$ ./rnchannelmain() startedHello CCC!Hello BBB!Hello AAA!Hello DDD!main() stopped為什么打印的行數(shù)可變?
查看完整描述

2 回答

?
繁花如伊

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

您不必等到打印完所有字符串才退出。一旦主線程到達(dá)執(zhí)行結(jié)束,它就會(huì)關(guān)閉所有 goroutine 并結(jié)束程序。由于這種情況同時(shí)發(fā)生,因此無(wú)法確定將允許打印多少個(gè)字符串。



查看完整回答
反對(duì) 回復(fù) 2023-07-10
?
慕容3067478

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

當(dāng)main()退出時(shí),所有 goroutine 都會(huì)被殺死。無(wú)法保證您的其他 goroutine 會(huì)在此之前完成,這就是并發(fā)的本質(zhì)。以下是修復(fù)方法。


首先,讓我們對(duì) 進(jìn)行一些更改greet。讓其休眠一會(huì)兒,以使問(wèn)題更加明顯。我們還將讓它接受字符串而不是通道,稍后我們就會(huì)明白原因。


func greet(str string) {

? ? time.Sleep(100 * time.Millisecond)

? ? fmt.Println("Hello " + str + "!")

}

我們不需要?jiǎng)?chuàng)建一堆 goroutine 從通道讀取固定次數(shù),而是需要一個(gè) goroutine 從通道讀取直到耗盡。使用 可以最簡(jiǎn)單地完成此操作range。這充分利用了渠道的優(yōu)勢(shì)。

我們還需要一種方法來(lái)告訴主程序等待循環(huán)完成。使用第二個(gè)通道最容易做到這一點(diǎn)。更復(fù)雜的同步使用WaitGroups。

c := make(chan string, 2)

done := make(chan bool, 1)

go func() {

? ? for str := range(c) {

? ? ? ? greet(str)

? ? }

? ? done <- true

}()

goroutine 會(huì)一直讀取c直到關(guān)閉。然后它會(huì)發(fā)送true到頻道done。兩者都經(jīng)過(guò)緩沖,以避免由于阻塞等待讀取或?qū)懭胪ǖ蓝鴮?dǎo)致死鎖。


回到main,我們寫入通道,顯式關(guān)閉它,然后等待從 讀取done。


? ? c <- "AAA"

? ? c <- "BBB"

? ? c <- "CCC"

? ? c <- "DDD"

? ? c <- "EEE"

? ? close(c)


? ? <-done

? ? fmt.Println("main() stopped")

<-done將阻塞,直到有東西可讀。這使得 goroutine 能夠完成。


并將它們整合在一起。


package main

import(

? ? "fmt"

? ? "time"

)

func greet(str string) {

? ? time.Sleep(100 * time.Millisecond)

? ? fmt.Println("Hello " + str + "!")

}

func main() {

? ? fmt.Println("main() started")

? ? c := make(chan string, 2)

? ? done := make(chan bool, 1)

? ? go func() {

? ? ? ? for str := range(c) {

? ? ? ? ? ? greet(str)

? ? ? ? }

? ? ? ? done <- true

? ? }()

? ? c <- "AAA"

? ? c <- "BBB"

? ? c <- "CCC"

? ? c <- "DDD"

? ? c <- "EEE"

? ? close(c)


? ? <-done

? ? fmt.Println("main() stopped")

}


查看完整回答
反對(duì) 回復(fù) 2023-07-10
  • 2 回答
  • 0 關(guān)注
  • 160 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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