Go公式WikiのTimeoutsの日本語意訳になります。
(元記事の最終更新日: 2014/12/10 rev.1)
タイムアウトに関する簡単な説明がされています。
タイムアウトとデッドライン
時間がかかりすぎる同期的な呼び出しを途中でやめるには、select
文とtime.After
を使います。
import "time"
c := make(chan error, 1)
go func() { c <- client.Call("Service.Method", args, &reply) } ()
select {
case err := <-c:
// エラーチェックと返信
case <-time.After(timeoutNanoseconds):
// タイムアウト呼び出し
}
チャネル c
のバッファサイズは1です。
もしc
がバッファなしチャネルでclient.Call
メソッドがtimeoutNanoseconds
以上の時間がかかった場合、チャネル送信が永遠にブロックされてしまい、ゴルーチンが破棄されなくなる可能性があります。
参考
time.After: http://golang.org/pkg/time/#After
select: http://golang.org/doc/go_spec.html#Select_statements
blog post: http://blog.golang.org/2010/09/go-concurrency-patterns-timing-out-and.html