用go代码实现启动2个groutine 2秒后取消, 第一个协程1秒执行完,第二个协程3秒执行完。
您好,这是一份可以实现您要求的 Go 代码:
package main
import (
"context"
"fmt"
"time"
)
func main() {
// 创建一个带有 2 秒超时的上下文
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel() // 一定要及时取消上下文
// 启动两个协程
go func() {
// 延时 1 秒
time.Sleep(1 * time.Second)
fmt.Println("1st goroutine finished.")
}()
go func() {
// 延时 3 秒
time.Sleep(3 * time.Second)
fmt.Println("2nd goroutine finished.")
}()
// 等待上下文超时或取消
<-ctx.Done()
fmt.Println("main finished.")
}
在上面的代码中,我们创建了一个有 2 秒超时的上下文,并启动了两个协程。第一个协程会延时 1 秒,第二个协程会延时 3 秒。在主函数中,我们等待上下文超时或取消。
在本示例中,由于第二个协程延时 3 秒,而我们创建的上下文只有 2 秒的超时,因此主函数会在 2 秒后结束,并取消所有协程。这就是为什么我们只能看到“1st goroutine finished.”的输出,而没有“2nd goroutine finished.”的输出的原因。
最后,请注意,在 Go 中,我们一般不直接使用 goroutine 来实现并发,而是使用 Go 协程池或者其它更高级的技术。在实际项
Copyright © 2022-2023, Koudai Team