1. 首页
  2. 主题
  3. Go基础

go协程读写到底是什么机制 这段代码为什么能按照顺序输出 好奇怪

miaozilong · · 2615 次点击
这段代码为什么能按照顺序输出 而且隔一秒输出一个 如果睡眠改成 time.Sleep(time.Second * time.Duration(rand.Intn(4))) 就更奇怪了 前几个输出是隔两三秒输出, 后面几个一起输出 ```go package main import ( "fmt" "log" "runtime" "strconv" "strings" "time" ) var ch = make(chan int) func task(i int) { time.Sleep(time.Second) log.Println("task...", i, "go id:", GoID()) <-ch } func GoID() int { var buf [64]byte n := runtime.Stack(buf[:], false) idField := strings.Fields(strings.TrimPrefix(string(buf[:n]), "goroutine "))[0] id, err := strconv.Atoi(idField) if err != nil { panic(fmt.Sprintf("cannot get goroutine id: %v", err)) } return id } func main() { for i := 0; i < 10; i++ { go task(i) ch <- i } fmt.Println("over") } ```
建议阅读下这篇文章: https://draveness.me/golang/docs/part3-runtime/ch06-concurrency/golang-channel/
#2
更多评论
1. 这段代码为什么能按照顺序输出 而且隔一秒输出一个 不是你代码里面写的 ``` time.Sleep(time.Second)``` ??,你这个 ```var ch = make(chan int)``` 是一个无缓冲的,按照你下面这种写法,相当于是写一个读一个,就是会顺序输出 ``` go task(i) ch &lt;- i ``` 2. 如果睡眠改成 time.Sleep(time.Second * time.Duration(rand.Intn(4))) 就更奇怪了 前几个输出是隔两三秒输出, 后面几个一起输出 随机的吧
#1

用户登录

没有账号?注册

今日阅读排行

    加载中

一周阅读排行

    加载中