用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 协程池或者其它更高级的技术。在实际项