向 channel 发送数据的问题

pengtoxen · · 1653 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

最近在学习 golang,对其中的 channel 有些不明白,希望有朋友可以解惑

package main

import (
    "fmt"
    "time"
)

func go1(msg_chan chan string) {
    for {
        msg_chan <- "go1"
    }
}
func go2(msg_chan chan string) {
    for {
        msg_chan <- "go2"
    }
}
func count(msg_chan chan string) {
    for {
        msg := <-msg_chan
        fmt.Println(msg)
        time.Sleep(time.Second * 1)
    }
}
func main() {
    var c chan string
    c = make(chan string)
    go go1(c)
    go go2(c)
    go count(c)
    var input string
    fmt.Scanln(&input)
}

运行后输出如下

go1
go2
go1
go2
go1
go2

可以看到 go1 和 go2 是交替输出的,我测试了多次,发现结果相同都是交替输出.

go1 函数和 go2 函数这两个是交替执行的吗?

在我目前的认知中,应该是 go1 和 go2 处于一个竞争关系,有可能 go1 发送了 2 个数据到 channel 后,待 main 函数把数据从 channel 中取出后,go2 才发送数据到 channel. 最后输出的结果应该是无序的.

然后结果却是有序的.不明白背后的机制是怎么样的.


注释掉sleep的情况下,go1和go2会争抢被CPU调度,结果就是无序的.
不注释sleep的情况下,go1和go2是交替出现的,个人认为sleep的时候,CPU会介入调度.


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:pengtoxen

查看原文:向 channel 发送数据的问题

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1653 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传