关于goroutine中goroutine的行为

我是 golang 新手,正在研究 goroutine。

我故意编写了使用 goroutine 来除法的简单代码。

首先,我给出基数并继续除它的数,直到它不可整除

但是,我改为go split(n),split(n)它不能像下面那样工作,这是为什么?


■ 源代码


package main


import (

    "flag"

    "fmt"

    "log"

    "net/http"

    "os"

    "strconv"

)


var next = make(chan int)

var quit = make(chan int)


func divide(n int) {

    defer func(){ quit <- 1 }()


    fmt.Println("[divide] n = " + strconv.Itoa(n))


    r := n % 2

    if r == 0 {

        next <- n / 2

    }

}


func execute() {


    fmt.Println("[execute] start")

    count := 0

    end   := false

    for !end {

        select {

        case n := <- next:

            count++

            fmt.Println("[execute] n = " + strconv.Itoa(n) + ", count = " + strconv.Itoa(count))

            go divide(n)

        case _ = <- quit:

            count--

            fmt.Println("[execute] end. count = " + strconv.Itoa(count))

            if count <= 0 {

                end = true

            }

        }

    }

    fmt.Println("complete")

    os.Exit(0)

}


func main() {


    base := flag.Int("n", 1, "Input the number")

    flag.Parse()


    if *base <= 0 {

        fmt.Println("please more than 1")

        os.Exit(0)

    }


    go execute()

    next <- *base


    if err := http.ListenAndServe(":8080", nil); err != nil {

        log.Fatal("ListenAndSearver:", err)

    }

}

■ 结果(工作正常)


$ go run main.go -n 6

[execute] start

[execute] n = 6, count = 1

[divide] n = 6

[execute] n = 3, count = 2

[execute] end. count = 1

[divide] n = 3

[execute] end. count = 0

complete

■ 结果(不工作)


$ go run main.go -n 6

[execute] start

[execute] n = 6, count = 1

[divide] n = 6


临摹微笑
浏览 138回答 1
1回答

叮当猫咪

没有go divide()内部执行:execute() 从next通道读取,调用divide除法()等待写入nextexecute()仍在等待divide()返回,因此程序现在陷入僵局。在go divide()内部执行:execute() 从next通道读取数据,divide在新的 goroutine 中启动,继续等待除法()写入nextexecute() 从 读取next,启动另一个 goroutine 等。请注意,一旦divide写入next,它就会继续写入quit,因此您可能会在一切完成之前收到多条退出消息。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go