在 Go 語言中,可以使用 context
包來進行協程調度超時的處理。
首先,你需要創建一個 context.Context
對象,并設置超時時間。然后,在需要執行耗時操作的協程中,使用 context.WithTimeout
函數將該 context
對象傳遞給協程。在協程內部,可以使用 select
語句來監聽 context.Done()
通道的關閉事件,一旦該通道被關閉,就表示超時或者父級協程取消了。
下面是一個簡單的示例代碼:
package main
import (
"context"
"fmt"
"time"
)
func main() {
// 創建一個上下文對象,并設置超時時間為 1 秒
ctx, cancel := context.WithTimeout(context.Background(), time.Second*1)
defer cancel()
// 啟動一個協程,并將上下文對象傳遞給協程
go doSomething(ctx)
// 等待 2 秒,以便協程有足夠的時間執行
time.Sleep(time.Second * 2)
}
func doSomething(ctx context.Context) {
select {
case <-ctx.Done():
// 超時或者父級協程取消了
fmt.Println("Timeout or canceled")
return
default:
// 執行耗時操作
time.Sleep(time.Second * 3)
fmt.Println("Operation completed")
}
}
在上面的示例中,協程 doSomething
執行了一個耗時操作,但是設置的超時時間只有 1 秒。當超過 1 秒之后,context.Done()
通道會被關閉,從而觸發 select
語句中的超時分支,輸出 “Timeout or canceled”。
需要注意的是,在實際使用中,你可能需要根據具體的業務場景和需求來適配超時處理的方式。