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 の一部です。