2017-02-16 3 views
1

私は例えば、time.Sleep()関数を実行するとき、私はゴルーチンのステータスに関する興味実行ゴルーチンの状況です:ゴルーチン場合time.Sleep()関数

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

は、 time.Sleep()関数を実行すると、待機状態になります。どのようにして状態をいつreadyに変更するのかをゴルーチンが知ることができますか?

私は実際には、時間の根底にあるメカニズムを知りたがっています。スリープ()ここに。

+2

https://go.googlesource.com/go/+/master/src/runtime/time.go –

答えて

2

ゴルーチンの状態はsleepになります。あなたがそれをテストすることができ、非常に短いプログラムがあります:

package main 

import (
    "time" 
) 

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

は、すべてのゴルーチンの状態を取得することGOTRACEBACK=1 go run test.goようにそれを実行します。

出力:

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 
関連する問題