time.Sleep居然会失效???求原理???

elitah · 2018-03-30 11:03:05 · 2895 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-03-30 11:03:05 的主题,其中的信息可能已经有所发展或是发生改变。

运行这个代码,https://studygolang.com/articles/8135

居然直接打印call就退出了

到底问题出在哪里??跪求高人告知

跪求高人告知

跪求高人告知

跪求高人告知

捕获.PNG


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

第 1 条附言  ·  2018-03-30 11:23:15

我没说明白,是func aaa中的sleep失效了

第 2 条附言  ·  2018-03-30 11:28:34

抱歉没说明白

按逻辑,新增加goroutine来执行func aaa,主线程执行到select应该阻塞等待chan,然后CPU调度到goroutine,延时3秒,然后往chan写数据,主线程收到数据,打印call

问题就是应该是3秒后打印call,而不是立即打印

第 3 条附言  ·  2018-03-30 12:10:10

抱歉了各位。是我搞错了

我不应该使用go run来测试

应该go build -o test test.go

生成二进制来测试完全没问题

捕获.PNG

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

2895 次点击  
加入收藏 微博
8 回复  |  直到 2018-04-13 14:19:46
elitah
elitah · #1 · 7年之前

主机是linux(ubuntu 14.04、ubuntu 16.06都试过)

系统都是386

捕获.PNG

justay
justay · #2 · 7年之前
func main() {
    go aaa()
    for {
        select {
        case <-ch: //拿到锁
            fmt.Println("call")
        case <-time.After(5 * time.Second): //超时5s
            fmt.Println("5 sec call")
        }
    }
}
elitah
elitah · #3 · 7年之前

抱歉是我没说明白,我知道加for循环不会退出,但是aaa中的time.Sleep失效

按逻辑,新增加goroutine来执行func aaa,主线程执行到select应该阻塞等待chan,然后CPU调度到goroutine,延时3秒,然后往chan写数据,主线程收到数据,打印call

问题就是应该是3秒后打印call,而不是立即打印

justay
justay · #4 · 7年之前

你可以试试,看打印出什么

package main

import (
    "fmt"
    "time"
)

var c = make(chan int, 1)

func main() {
    go aaa()
    sec := 0
    for {
        select {
        case <-c:
            fmt.Println("after 3 sec")
            return
        case <-time.After(time.Second):
            sec = sec + 1
            fmt.Println(sec)
        }
    }
}

func aaa() {
    time.Sleep(time.Second * 3)
    c <- 1
}
mortemnh
mortemnh · #5 · 7年之前

win10 go 1.10.1 正常,延迟3s

elitah
elitah · #6 · 7年之前
justayjustay #4 回复

你可以试试,看打印出什么 ```golang package main import ( "fmt" "time" ) var c = make(chan int, 1) func main() { go aaa() sec := 0 for { select { case <-c: fmt.Println("after 3 sec") return case <-time.After(time.Second): sec = sec + 1 fmt.Println(sec) } } } func aaa() { time.Sleep(time.Second * 3) c <- 1 } ```

你这个代码没问题

我自己也尝试在select前后都加一条打印语句就正常了

捕获.PNG

zhaozonglu
zhaozonglu · #7 · 7年之前

直接go run 也没问题呀,等待三秒,打印出call

elitah
elitah · #8 · 7年之前

@zhaozonglu 第一次编译花了3秒,运行3秒,共计6秒,感觉等了很久 程序没有改动,第二次第三次。。。第n次,编译只花了0.*秒,运行3秒,但是人产生了错觉,以为消耗的时间是编译的时间,程序只运行了一瞬间的结束了

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