首页 > 文章列表 > 在golang中如何取消阻塞操作?

在golang中如何取消阻塞操作?

golang
276 2023-05-27

问题内容

在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)
}