面试题答案
一键面试- 描述使用
context
包设定并发任务执行超时时间的方法:- 在Go语言中,
context
包用于在多个goroutine之间传递截止时间、取消信号等相关信息。 - 要设定并发任务的执行超时时间,通常使用
context.WithTimeout
函数。该函数接受两个参数,一个是父context
(一般使用context.Background
作为顶层上下文),另一个是超时时间。它会返回一个新的context
和一个取消函数CancelFunc
。 - 在并发任务中,通过监听新
context
的Done
通道来判断是否超时。如果Done
通道接收到数据,说明超时或者被取消,此时可以停止任务的执行。
- 在Go语言中,
- 示例代码:
package main
import (
"context"
"fmt"
"time"
)
func main() {
// 创建一个带有5秒超时的context
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
// 启动一个goroutine执行任务
go func(ctx context.Context) {
select {
case <-time.After(10 * time.Second):
fmt.Println("任务正常完成")
case <-ctx.Done():
fmt.Println("任务超时")
}
}(ctx)
// 主goroutine等待一段时间,以确保goroutine有机会执行
time.Sleep(15 * time.Second)
}
在上述代码中:
- 首先通过
context.WithTimeout(context.Background(), 5*time.Second)
创建了一个带有5秒超时的context
。 - 然后在一个新的goroutine中模拟执行一个任务,这个任务正常完成需要10秒。
- 通过
select
语句监听time.After(10 * time.Second)
和ctx.Done()
,如果ctx.Done()
先接收到数据,说明任务超时,打印“任务超时”;如果time.After(10 * time.Second)
先接收到数据,说明任务正常完成,打印“任务正常完成”。 - 主goroutine通过
time.Sleep(15 * time.Second)
等待一段时间,以确保新启动的goroutine有机会执行。