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
以上の時間がかかった場合、チャネル送信が永遠にブロックされてしまい、ゴルーチンが破棄されなくなる可能性があります。