Go のタイムアウトを設定する方法
Goでは、contextパッケージを使用してタイムアウト終了を設定できます。以下にその例を示します。
package main
import (
"context"
"fmt"
"time"
)
func main() {
// 创建一个父级的context
ctx := context.Background()
// 创建一个带有超时的子级context,超时时间为3秒
ctx, cancel := context.WithTimeout(ctx, 3*time.Second)
defer cancel()
// 启动一个goroutine执行耗时操作
go func() {
// 模拟一个耗时的操作,需要5秒
time.Sleep(5 * time.Second)
// 检查context是否已经超时
if ctx.Err() != nil {
fmt.Println("超时退出")
return
}
// 执行其他操作...
}()
// 等待context超时或被取消
select {
case <-ctx.Done():
fmt.Println(ctx.Err())
case <-time.After(10 * time.Second):
fmt.Println("正常退出")
}
}
この例では、まずcontext.Background()を使用して親のコンテキストを作成し、次にcontext.WithTimeout()を使用して3秒のタイムアウトを伴う子のコンテキストを作成します。
その後、5秒かかる処理をゴルーチンで実行します。処理が完了したら、contextのタイムアウトが切れているかをチェックし、タイムアウトしている場合は「タイムアウトのため終了」と出力して返します。
最後に、selectステートメントを使用して、コンテキストのタイムアウトまたはキャンセルを待ちます。コンテキストがタイムアウトした場合、タイムアウトエラーを表示し、コンテキストがキャンセルされた場合、キャンセルエラーを表示し、10秒以上経過してもタイムアウトまたはキャンセルが行われなかった場合、「正常終了」を表示します。