2017-02-24 6 views
0

このゴルーチンブロック...なぜこのゴルーチンはブロックされますか?

go log.Fatal(http.ListenAndServe(":8000", nil)) 
log.Print("This doesn't print") 

このゴルーチンはブロックされません...

go func() { 
    log.Fatal(http.ListenAndServe(":8000", nil)) 
}() 
log.Print("This prints") 

このゴルーチンもブロックされません...

go http.ListenAndServe(":8000", nil) 
log.Print("This prints") 

答えて

2

これが応じています仕様へ:

関数値とパラメータa再発呼ゴルーチン

https://golang.org/ref/spec#Go_statements

に通常通り評価

go log.Fatal(http.ListenAndServe(":8000", nil)) 

の最初のパラメータは、ゴルーチンとして機能log.Fatalを実行する前に評価されるであろう

http.ListenAndServe(":8000", nil) 

あります、したがってブロックします。

-2

うーん、 私はプログラムを実行しました:

package main 

import (
    "net/http" 
    "log" 
) 

func main() { 
    go log.Fatal(http.ListenAndServe(":8000", nil)) 
    log.Print("This doesn't print") 
} 

そして、うまく動作しているようです:

curl 127.0.0.1:8000 -v 
* Rebuilt URL to: 127.0.0.1:8000/ 
* Trying 127.0.0.1... 
* TCP_NODELAY set 
* Connected to 127.0.0.1 (127.0.0.1) port 8000 (#0) 
> GET/HTTP/1.1 
> Host: 127.0.0.1:8000 
> User-Agent: curl/7.51.0 
> Accept: */* 
> 
< HTTP/1.1 404 Not Found 
< Content-Type: text/plain; charset=utf-8 
< X-Content-Type-Options: nosniff 
< Date: Fri, 24 Feb 2017 08:22:19 GMT 
< Content-Length: 19 
< 
404 page not found 
* Curl_http_done: called premature == 0 
* Connection #0 to host 127.0.0.1 left intact 

マイゴーバージョン:

go1.7.3 darwin/amd64 

など建築、外出先のバージョンと同様に、あなたのランタイムに関する詳細な情報を指定してください

1

go log.Fatal(http.ListenAndServe(":8000", nil))はもちろん、それブロックの

e := http.ListenAndServe(":8000", nil) 
go log.Fatal(e) 

に相当します。
go func() { log.Fatal(http.ListenAndServe(":8000", nil)) }()

については、独立したゴルーチンとしての機能の実行を開始する。複数のゴルーチンからロガーを同時に使用できるので、log.Print("This prints")に電話すると印刷されます。

関連する問題