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

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

Go中沒(méi)有Goroutine的輸出

Go中沒(méi)有Goroutine的輸出

Go
喵喵時(shí)光機(jī) 2019-07-13 15:56:37
當(dāng)SayHello()按預(yù)期執(zhí)行,Goroutine將不打印任何內(nèi)容。package mainimport "fmt"func SayHello() {     for i := 0; i < 10 ; i++ {         fmt.Print(i, " ")     }}func main() {     SayHello()     go SayHello()}
查看完整描述

3 回答

?
尚方寶劍之說(shuō)

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

當(dāng)你main()函數(shù)結(jié)束,您的程序也結(jié)束了。它不會(huì)等待其他的峽谷完成。

引用Go語(yǔ)言規(guī)范:程序執(zhí)行:

程序執(zhí)行從初始化主包開(kāi)始,然后調(diào)用函數(shù)。main..當(dāng)函數(shù)調(diào)用返回時(shí),程序?qū)⑼顺?。它不?huì)等待其他的(非-main)完成的大猩猩。

看見(jiàn)這個(gè)答案更多細(xì)節(jié)。

你得告訴你的main()函數(shù)等待SayHello()函數(shù)開(kāi)始時(shí)是一個(gè)要完成的Goroutine。您可以將它們與通道同步,例如:

func SayHello(done chan int) {
    for i := 0; i < 10; i++ {
        fmt.Print(i, " ")
    }
    if done != nil {
        done <- 0 // Signal that we're done
    }}func main() {
    SayHello(nil) // Passing nil: we don't want notification here
    done := make(chan int)
    go SayHello(done)
    <-done // Wait until done signal arrives}

另一種選擇是關(guān)閉通道,發(fā)出信號(hào)表示完成:

func SayHello(done chan struct{}) {
    for i := 0; i < 10; i++ {
        fmt.Print(i, " ")
    }
    if done != nil {
        close(done) // Signal that we're done
    }}func main() {
    SayHello(nil) // Passing nil: we don't want notification here
    done := make(chan struct{})
    go SayHello(done)
    <-done // A receive from a closed channel returns the zero value immediately}

注:

根據(jù)您的編輯/注釋:如果要運(yùn)行2SayHello()函數(shù)隨機(jī)打印“混合”數(shù)字:你不能保證觀察這種行為。再次,請(qǐng)參閱上述答復(fù)更多細(xì)節(jié)。這個(gè)GO記憶模型只有保證某些事件發(fā)生在其他事件之前,才能保證如何執(zhí)行2個(gè)并發(fā)的goroutines。

您可以嘗試它,但知道結(jié)果不會(huì)是決定性的。首先,您必須允許使用以下方法執(zhí)行多個(gè)活動(dòng)的goroutines:

runtime.GOMAXPROCS(2)

第二,你必須先開(kāi)始SayHello()因?yàn)楫?dāng)前代碼首先執(zhí)行SayHello()在主要的Goroutine中,只有當(dāng)它完成之后,另一個(gè)就開(kāi)始了:

runtime.GOMAXPROCS(2)done := make(chan struct{})go SayHello(done) 
// FIRST START goroutineSayHello(nil) 
// And then call SayHello() in the main goroutine<-done 
// Wait for completion


查看完整回答
反對(duì) 回復(fù) 2019-07-13
?
不負(fù)相思意

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

或者(對(duì)icza的回答)你可以用WaitGroup從…sync包和匿名函數(shù)以避免更改原始SayHello.

package mainimport (
    "fmt"
    "sync")func SayHello() {
    for i := 0; i < 10; i++ {
        fmt.Print(i, " ")
    }}func main() {
    SayHello()

    var wg sync.WaitGroup
    wg.Add(1)

    go func() {
        defer wg.Done()
        SayHello()
    }()

    wg.Wait()}

為了同時(shí)打印數(shù)字,在單獨(dú)的例程中運(yùn)行每個(gè)print語(yǔ)句,如下所示

package mainimport (
    "fmt"
    "math/rand"
    "sync"
    "time")func main() {
    var wg sync.WaitGroup

    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func(fnScopeI int) {
            defer wg.Done()

            // next two strings are here just to show routines work simultaneously
            amt := time.Duration(rand.Intn(250))
            time.Sleep(time.Millisecond * amt)

            fmt.Print(fnScopeI, " ")
        }(i)
    }

    wg.Wait()}


查看完整回答
反對(duì) 回復(fù) 2019-07-13
?
拉風(fēng)的咖菲貓

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

正如其他人所提到的,當(dāng)main函數(shù)返回。

一種選擇是使用類似于sync.WaitGroup在其他的峽谷里等著main在從main.

另一個(gè)選擇是runtime.Goexit()在……里面main..從戈多:

GoExit終止了調(diào)用它的Goroutine。沒(méi)有其他戈魯丁受到影響。Goexport在終止Goroutine之前運(yùn)行所有延遲的呼叫。因?yàn)镚oExit并不是一種恐慌,所以那些延遲函數(shù)中的任何恢復(fù)調(diào)用都會(huì)返回零。

從主Goroutine調(diào)用GoExit將終止該Goroutine,而不需要主返回。由于FuncMain尚未返回,該程序?qū)⒗^續(xù)執(zhí)行其他goroutines。如果其他所有的Goroutines退出,程序就會(huì)崩潰。

這允許主goroutine在后臺(tái)例程繼續(xù)執(zhí)行時(shí)停止執(zhí)行。例如:

package mainimport (
    "fmt"
    "runtime"
    "time")func f() {
    for i := 0; ; i++ {
        fmt.Println(i)
        time.Sleep(10 * time.Millisecond)
    }}func main() {
    go f()
    runtime.Goexit()}

這可能比永遠(yuǎn)阻塞主函數(shù)更干凈,特別是對(duì)于無(wú)限的程序。一個(gè)缺點(diǎn)是,如果進(jìn)程返回或退出(包括主要的goroutine)的所有循環(huán)都會(huì)檢測(cè)到這是一個(gè)錯(cuò)誤和恐慌:

fatal error: no goroutines (main called runtime.Goexit) - deadlock!

為了避免這種情況,至少必須有一個(gè)Goroutine調(diào)用os.Exit在它回來(lái)之前。呼叫os.Exit(0)立即終止程序,并表示它沒(méi)有出錯(cuò)。例如:

package mainimport (
    "fmt"
    "os"
    "runtime"
    "time")func f() {
    for i := 0; i < 10; i++ {
        fmt.Println(i)
        time.Sleep(10 * time.Millisecond)
    }
    os.Exit(0)}func main() {
    go f()
    runtime.Goexit()}


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

添加回答

舉報(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)