我是 golang 新手,正在研究 goroutine。我故意编写了使用 goroutine 来除法的简单代码。首先,我给出基数并继续除它的数,直到它不可整除但是,我改为go split(n),split(n)它不能像下面那样工作,这是为什么?■ 源代码package mainimport ( "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 = 0complete■ 结果(不工作)$ go run main.go -n 6[execute] start[execute] n = 6, count = 1[divide] n = 6
1 回答
叮当猫咪
TA贡献1776条经验 获得超12个赞
没有go divide()
内部执行:
execute() 从
next
通道读取,调用divide
除法()等待写入
next
execute()仍在等待divide()返回,因此程序现在陷入僵局。
在go divide()
内部执行:
execute() 从
next
通道读取数据,divide
在新的 goroutine 中启动,继续等待除法()写入
next
execute() 从 读取
next
,启动另一个 goroutine 等。
请注意,一旦divide
写入next
,它就会继续写入quit
,因此您可能会在一切完成之前收到多条退出消息。
- 1 回答
- 0 关注
- 128 浏览
添加回答
举报
0/150
提交
取消