问题:
您正在构建一个处理多个 HTTP 调用的工具在并发 goroutine 中。为了防止无限期执行的情况,您寻求一种在特定时间间隔后取消 goroutine 的方法。
解决方案:
同时创建 goroutine 休眠的方法在指定的时间内发送广播消息来取消其他 goroutine 似乎是合乎逻辑的,在这种情况下 goroutine 的执行似乎存在问题。
要解决此挑战,请考虑利用 Go 中的 context 包。它提供了一种有效的方法来处理 Goroutine 的超时和上下文取消。
代码片段:
下面是一个使用 context 包进行 Goroutine 超时管理的示例:
package main import ( "context" "fmt" "time" ) func test(ctx context.Context) { t := time.Now() select { case <-time.After(1 * time.Second): fmt.Println("overslept") case <-ctx.Done(): fmt.Println("cancelled") } fmt.Println("used:", time.Since(t)) } func main() { ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond) go test(ctx) // cancel context after 30 milliseconds time.Sleep(30 * time.Millisecond) cancel() }
此代码创建一个超时时间为 50 毫秒的上下文。然后启动一个 goroutine 来执行测试函数,并传递上下文。在测试函数中,选择语句等待超时发生或上下文被取消。 30 毫秒后,上下文被取消,导致 goroutine 完成并打印“cancelled”。
以上是Go 的 context 包如何用于超时 Goroutine?的详细内容。更多信息请关注PHP中文网其他相关文章!