在golang中如何取消阻塞操作?
在 Go 中取消阻塞操作通常使用 context.Context
实现。context
包提供了一种在多个 Goroutine 之间传递取消信号的机制。以下是一个示例,演示如何使用 context
来取消阻塞操作:
package main import ( "context" "fmt" "time" ) func main() { // 创建一个父级 Context parentCtx := context.Background() // 创建一个带有取消函数的子级 Context ctx, cancel := context.WithCancel(parentCtx) // 启动一个 Goroutine 执行阻塞操作 go func() { // 模拟一个长时间运行的操作 time.Sleep(2 * time.Second) // 检查是否已经取消 if ctx.Err() != nil { fmt.Println("操作已被取消") return } // 执行阻塞操作 fmt.Println("执行阻塞操作...") // 在这里编写你的阻塞操作代码 // 检查是否已经取消 if ctx.Err() != nil { fmt.Println("操作已被取消") return } // 操作完成 fmt.Println("操作完成") }() // 等待一段时间 time.Sleep(1 * time.Second) // 取消操作 cancel() // 等待 Goroutine 结束 time.Sleep(1 * time.Second) }