Go语言的timeout和select随机问题

663280439 · · 4540 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

看无闻的Go教程中提到,Go的select对channel的操作,是随机的。我测试的时候,在select中对channel写数据,确实是随机的。但是,我还想证实一下,select对channel的读,也是随机的。下面是一个例子,我通过goroutine,对ch1和ch2两个channel读取数据。为了避免ch1和ch2刚顺序写完就被读出来,影响实验的准确性。我特意在goroutine中使用了timeout。但是我发现两个问题: ①:最终还是先输出ccc,再输出ddd,运行多少次都是一样。我的理解,虽然goroutine后台去执行了,但是休眠5s的过程中,ch1和ch2都已经有值了,那么休眠结束后,理应会随机先输出ccc或者ddd啊 ②:关于timeout,我用sublime的插件gosublime开发,发现运行开始到结束,都是一下子输出的,没有体现出来时间停顿一个一个输出这个现象,但是,在Wide(http://studygolang.com/wide/playground )里面运行下面的代码,就是一个一个输出的,并非一下子都输出出来,这又是为什么? ```go package main import "fmt" import "time" func main() { //定义两个字符串类型的channel ch1, ch2 := make(chan string, 0), make(chan string, 0) //启用goruntine不断从两个channel中读取数据 go func() { fmt.Println("start") time.Sleep(5 * time.Second) fmt.Println("wait") time.Sleep(2 * time.Second) //i := 1 for { // fmt.Println(i) // i++ select { case v, ok := <-ch1: if ok { fmt.Println(ok, v) } else { fmt.Println("!!!!") } case v, ok := <-ch2: if ok { fmt.Println(ok, v) } else { fmt.Println("~~~~") } } } }() //time.Sleep(2 * time.Second) ch1 <- "cccc" ch2 <- "dddd" time.Sleep(1 * time.Second) fmt.Println("end") } ```

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

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

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