练习 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)
讨论数量: 2

:因为协程是异步的,但是又是依赖主线程的 我的理解是这里没有同步异步的概念,因为main函数也是协成,启动程序肯定优先执行main函数,main函数在执行过程中, 没有被阻塞,所以main跑完了,别的协成都没跑 假设cpu是单核单线程的,一个线程在一个时间只能做一件事情,不是吗? main不阻塞掉别的协成怎么跑 我个人猜想,如果你电脑cpu是多核的,这些协成分别在不同的核上跑,假设别的核跑的比main对应的核还快,运气好不适用sleep也能看到结果 这是我的个人见解 :grin:

2年前 评论

本来就支持多线程的go语言怎么能跟单线程的js比呢,当然js由他独立的时间循环保证了程序执型的效果

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!