简体   繁体   English

执行time.Sleep()函数时goroutine的状态是什么

[英]what is the status of goroutine when execute time.Sleep() function

I'm curious about the status of goroutine when I execute the time.Sleep() function, for example: 当我执行time.Sleep()函数时,我对goroutine的状态感到好奇,例如:

func main() {
    fmt.Println("before test")
    time.Sleep(time.Second * 2)
    fmt.Println("test")
}

if the goroutine would become the waiting state when execute the time.Sleep() function, how could the goroutine know when to change the state into the ready? 如果执行time.Sleep()函数时goroutine将成为等待状态,goroutine怎么知道何时将状态更改为ready?

I really want to know the underlying mechanism of time.Sleep() here. 我真的想知道time.Sleep()的基本机制。

The state of the goroutine will be sleep . goroutine的状态将是sleep There is very short program you can test it with: 有一个很短的程序,你可以测试它:

package main

import (
    "time"
)

func main() {
    go func() {
        time.Sleep(3 * time.Second)
    }()
    time.Sleep(1 * time.Second)
    panic("foo")
}

Run it like that GOTRACEBACK=1 go run test.go to get the state of all goroutines. 运行它就像GOTRACEBACK=1 go run test.go来获得所有goroutines的状态。

Output: 输出:

panic: foo

goroutine 1 [running]:
panic(0x45afa0, 0xc42006c000)
    /usr/local/go/src/runtime/panic.go:500 +0x1a1
main.main()
    /home/user/path/test.go:12 +0x96

goroutine 4 [sleep]:
time.Sleep(0xb2d05e00)
    /usr/local/go/src/runtime/time.go:59 +0xe1
main.main.func1()
    /home/user/path/test.go:9 +0x2b
created by main.main
    /home/user/path/test.go:10 +0x39
exit status 2

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM