go 笔记 十三章 context 包的基础使用和代码示例

未使用 context 版本

package main

import (
	"fmt"
	"time"
)

func main() {
	flag := make(chan bool)
	message := make(chan int)
	go son(flag, message)
	for i := 0; i < 10; i++ {
		message <- i
	}
	flag <- true
	time.Sleep(time.Second)
	fmt.Println("main process over")
}

func son(flag chan bool, message chan int) {
	t := time.Tick(time.Second)

	for _ = range t {
		select {
		case f := <-flag:
			println("son process over", f)
			return
		case msg := <-message:
			println("son: message", msg)
		default:
			println("son: default")
		}
	}
}

使用 context key value 版本

package main

import (
	"context"
	"fmt"
	"time"
)

func main() {
	ctx := context.WithValue(context.Background(), "name", "qm")
	ctx, cancel := context.WithCancel(ctx)
	message := make(chan int)
	go son(ctx, message)
	for i := 0; i < 2; i++ {
		message <- i
	}
	cancel()
	time.Sleep(time.Second)
	fmt.Println("main process over")
}

func son(ctx context.Context, message chan int) {
	t := time.Tick(time.Second)

	for _ = range t {
		select {
		case <-ctx.Done():
			fmt.Println("son process over", ctx.Value("name"))
			return
		case msg := <-message:
			fmt.Println("son: message", msg)
		default:
			println("son: default")
		}
	}
}
    

WithDeadLine,WithTimeout 版本

package main

import (
	"context"
	"fmt"
	"time"
)

func main() {
	//ctx := context.WithValue(context.Background(), "name", "qm")
	//ctx, cancel := context.WithCancel(ctx)
	//ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(time.Second*6))
	ctx, cancel := context.WithTimeout(context.Background(), time.Second*3)
	message := make(chan int)
	go son(ctx, message)
	for i := 0; i < 8; i++ {
		message <- i
	}
	defer cancel()
	time.Sleep(time.Second)
	fmt.Println("main process over")
}

func son(ctx context.Context, message chan int) {
	t := time.Tick(time.Second)

	for _ = range t {
		select {
		case <-ctx.Done():
			fmt.Println("son process over")
			return
		case msg := <-message:
			fmt.Println("son: message", msg)
		default:
			println("son: default")
		}
	}
}

另一个 DeadLine 版本

package main

import (
	"context"
	"fmt"
	"time"
)

func main() {
	// 创建一个父上下文(context)
	parentCtx := context.Background()

	// 设置截止时间为当前时间加上 3 秒
	deadline := time.Now().Add(3 * time.Second)

	// 使用 WithDeadline 创建带有截止时间的子上下文(context)
	ctx, cancel := context.WithDeadline(parentCtx, deadline)
	defer cancel()

	// 在子上下文中执行一些操作(例如模拟网络请求)
	go performTask(ctx)

	// 等待一段时间,以模拟主程序执行其他操作
	time.Sleep(5 * time.Second)
}

func performTask(ctx context.Context) {
	// 检查上下文是否已经被取消
	select {
	case <-ctx.Done():
		// 上下文已经被取消,结束任务
		fmt.Println("Task canceled:", ctx.Err())
		return
	default:
		// 上下文未被取消,继续执行任务
		fmt.Println("Performing task...")
		time.Sleep(2 * time.Second)
		fmt.Println("Task completed")
	}
}
    
    ```

你可能感兴趣的:(go,笔记,golang,笔记,数据库)