Go Wiki: タイムアウトとデッドライン
長時間実行される同期呼び出しを中止するには、time.Afterを使用したselect文を使用します。
import "time"
c := make(chan error, 1)
go func() { c <- client.Call("Service.Method", args, &reply) } ()
select {
case err := <-c:
// use err and reply
case <-time.After(timeoutNanoseconds):
// call timed out
}
チャネル `c` のバッファサイズは 1 であることに注意してください。バッファされていないチャネルで、client.Call メソッドが `timeoutNanoseconds` よりも長くかかった場合、チャネル送信は永遠にブロックされ、ゴルーチンは破棄されません。
参考資料
time.After: https://pkg.go.dev/time/#After
select: https://go.dokyumento.jp/ref/spec#Select_statements
ブログ記事: https://go.dokyumento.jp/blog/2010/09/go-concurrency-patterns-timing-out-and.html
このコンテンツは Go Wiki の一部です。