猿问

当没有线路调用它时,控制如何转到主 goroutine?

// _Closing_ a channel indicates that no more values

// will be sent on it. This can be useful to communicate

// completion to the channel's receivers.


package main


import "fmt"


// In this example we'll use a `jobs` channel to

// communicate work to be done from the `main()` goroutine

// to a worker goroutine. When we have no more jobs for

// the worker we'll `close` the `jobs` channel.

func main() {

    jobs := make(chan int, 5)

    done := make(chan bool)


    fmt.Println("1")

    go func() {

        for {

                fmt.Println("4")

            j, more := <-jobs

            if more {

                fmt.Println("received job", j)

            } else {

                fmt.Println("received all jobs")

                done <- true

                return

            }

        }

    }()


    fmt.Println("2")

    // This sends 3 jobs to the worker over the `jobs`

    // channel, then closes it.

    for j := 1; j <= 3; j++ {

            fmt.Println("3", j)

        jobs <- j

        fmt.Println("sent job", j)

    }


    fmt.Println("5")

    close(jobs)


    fmt.Println("6")

    fmt.Println("sent all jobs")

    //How does control go from here to the main's go routine - line 18. Who call's it? and How?


    // We await the worker using the

    // [synchronization](channel-synchronization) approach

    // we saw earlier.

    <-done


    fmt.Println("7")

}

https://play.golang.org/p/Xe_wh3YTmwk


控制如何从第 46 行转到第 18 行?


慕码人2483693
浏览 158回答 1
1回答

慕妹3242003

当您将 Go 应用程序编译为可执行二进制文件时,编译器会在二进制文件中包含一个运行时。运行您的应用程序时,此运行时负责调度和运行 goroutine。在第 17 行中,您启动了一个 goroutine,因此运行时将安排与maingoroutine 并发运行它,并且可能并行运行(如果有足够的内核并且 GOMAXPROCS 允许,有关详细信息,请参阅Concurrency is not parallelism)。规范:Go 语句:函数值和参数在调用 goroutine 中像往常一样被评估,但与常规调用不同,程序执行不会等待调用的函数完成。相反,该函数开始在一个新的 goroutine 中独立执行。当函数终止时,它的 goroutine 也会终止。如果函数有任何返回值,它们会在函数完成时被丢弃。
随时随地看视频慕课网APP

相关分类

Go
我要回答