Go-标准库-context(一)

2023-04-22 10:14:40 浏览数 (1)

概述

context包提供了一种方式来传递请求范围的值,包括请求截止时间、取消信号、以及请求作用域的值等。context包被广泛用于Go中的网络编程、多线程编程等领域,可以方便地控制多个goroutine之间的交互。

基本使用

context包提供了两种类型的context:Background context和Cancel context。Background context是最基本的context,不包含任何值和取消信号。Cancel context是基于Background context衍生出来的一种context,它包含一个Done channel,用于传递取消信号,同时也包含一个Context值,可以用来传递请求范围的值。

使用context包需要遵循以下几个基本步骤:

  1. 创建一个Background context或一个Cancel context。
  2. 将context作为参数传递给需要控制的goroutine或函数。
  3. 在goroutine或函数中检查context是否已经被取消。
  4. 在需要传递请求范围的值时,将值保存到context中。

下面是一个使用Cancel context的示例程序:

代码语言:javascript复制
package main

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

func work(ctx context.Context, name string) {
    for {
        select {
        case <-ctx.Done():
            fmt.Printf("%s: cancelledn", name)
            return
        default:
            fmt.Printf("%s: workingn", name)
            time.Sleep(1 * time.Second)
        }
    }
}

func main() {
    ctx, cancel := context.WithCancel(context.Background())

    go work(ctx, "worker1")
    go work(ctx, "worker2")
    go work(ctx, "worker3")

    time.Sleep(3 * time.Second)
    cancel()

    time.Sleep(1 * time.Second)
    fmt.Println("main: cancelled all workers")
}

在这个示例程序中,我们创建了一个Cancel context,并通过context.WithCancel函数创建了一个Cancel context对象和一个取消函数cancel。然后,我们创建了三个goroutine,分别代表三个worker。每个worker都在一个无限循环中工作,不断输出一些信息。同时,每个worker都会检查context是否已经被取消,如果已经被取消,则退出循环。

在main函数中,我们等待三秒钟,然后调用cancel函数取消所有worker的工作。最后,我们等待一秒钟,然后输出一条消息表示所有worker都已经被取消。

go

0 人点赞