练习 14.4:解释一下为什么如果在函数 getData () 的一开始插入 time.Sleep (2e9),不会出现错误但也没有输出呢。
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan string)
go sendData(ch)
go getData(ch)
time.Sleep(1e9)
}
func sendData(ch chan string) {
ch <- "1"
ch <- "2"
ch <- "3"
ch <- "4"
ch <- "5"
}
func getData(ch chan string) {
time.Sleep(2e9)
var input string
for {
input = <-ch
fmt.Printf("%s ", input)
fmt.Print("...")
}
}
说一下我的理解,因为协程是异步的,但是又是依赖主线程的(主线程结束,相关协程也结束了)。
这里主线程只sleep了一秒
getData协程sleep了两秒
主进程都结束了,协程也结束了,自然执行不到后面的去管道去数据的操作了
ps:之前我没理解题意,想了半天。在setData和getData直接加的sleep(如下) 完全不影响出结果(因为协程是阻塞的,会等到管道输入和输出都准备完毕才开始数据传输)。
go sendData(ch)
time.Sleep(2e9)
go getData(ch)
:因为协程是异步的,但是又是依赖主线程的 我的理解是这里没有同步异步的概念,因为main函数也是协成,启动程序肯定优先执行main函数,main函数在执行过程中, 没有被阻塞,所以main跑完了,别的协成都没跑 假设cpu是单核单线程的,一个线程在一个时间只能做一件事情,不是吗? main不阻塞掉别的协成怎么跑 我个人猜想,如果你电脑cpu是多核的,这些协成分别在不同的核上跑,假设别的核跑的比main对应的核还快,运气好不适用sleep也能看到结果 这是我的个人见解 :grin:
本来就支持多线程的go语言怎么能跟单线程的js比呢,当然js由他独立的时间循环保证了程序执型的效果