如果没有其他要执行的语句,为什么time.Sleep不起作用?

时间:2019-09-24 11:59:14

标签: go time goroutine channels go-playground

我正在尝试在下面的代码段中运行

Traceback (most recent call last):
  File "c:/Users/rodri/Desktop/Python/pong/index.py", line 63, in <module>
    wn.onkey(paddlebup, 'UP')
  File "C:\Users\rodri\AppData\Local\Programs\Python\Python37\lib\turtle.py", line 1394, in onkey
    self._onkeyrelease(fun, key)
  File "C:\Users\rodri\AppData\Local\Programs\Python\Python37\lib\turtle.py", line 687, in _onkeyrelease
    self.cv.bind("<KeyRelease-%s>" % key, eventfun)
  File "C:\Users\rodri\AppData\Local\Programs\Python\Python37\lib\turtle.py", line 416, in bind
    self._canvas.bind(*args, **kwargs)
  File "C:\Users\rodri\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 1251, in bind
    return self._bind(('bind', self._w), sequence, func, add)
  File "C:\Users\rodri\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 1206, in _bind
    self.tk.call(what + (sequence, cmd))
_tkinter.TclError: bad event type or keysym "UP"

如预期的那样,它等待6秒钟,打印“完成”,然后退出

但是如果我删除打印语句,

package main

import (
    "fmt"
    "time"
)

func main() {
    time.Sleep(time.Millisecond*6000)
    fmt.Println("Done")
}

它不会等待并立即退出。为什么?

因此,请看下面的代码

package main

import (
    "time"
)

func main() {
    time.Sleep(time.Millisecond*6000)
}

如果没有接收者可以读取package main import ( "fmt" "time" ) func main() { c := make(chan int) go count(6, c) time.Sleep(time.Millisecond*5000) } func count(num int, c chan int) { for i := 1; i <= num; i++ { fmt.Println(i) c <- i time.Sleep(time.Millisecond*2000) } close(c) } 函数,即使有一个{{ 1}}之后的语句。但是当我删除声明

count

i函数确实会等待那5秒钟,因此main goroutine一直计数到3。

这是怎么回事?

1 个答案:

答案 0 :(得分:3)

在本地运行它,它将等待。 Go Playground上的输出将被缓存。如果没有输出,则不会让您等待6秒。如果有输出,则保留输出的时间。

阅读博客文章:The Go Blog: Inside the Go Playground:

  

我们捕获每次写入标准输出和标准错误的时间,并将其提供给客户端。然后,客户端可以按正确的时间“回放”写入,以便输出看起来就像程序在本地运行一样。