下载APP
登录
关闭
讲堂
算法训练营
Python 进阶训练营
企业服务
极客商城
客户端下载
兑换中心
渠道合作
推荐作者
当前播放: 29 | Context与任务取消
00:00 / 00:00
标清
  • 标清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看

Go语言从入门到实战

共55讲 · 55课时,约700分钟
6092
免费
01 | Go语言课程介绍
免费
02 | 内容综述
免费
03 | Go语言简介:历史背景、发...
免费
04 | 编写第一个Go程序
免费
05 | 变量、常量以及与其他语言...
06 | 数据类型
07 | 运算符
08 | 条件和循环
09 | 数组和切片
10 | Map声明、元素访问及遍历
11 | Map与工厂模式,在Go语言...
12 | 字符串
13 | Go语言的函数
14 | 可变参数和defer
15 | 行为的定义和实现
16 | Go语言的相关接口
17 | 扩展与复用
18 | 不一样的接口类型,一样的...
19 | 编写好的错误处理
20 | panic和recover
21 | 构建可复用的模块(包)
22 | 依赖管理
23 | 协程机制
24 | 共享内存并发机制
25 | CSP并发机制
26 | 多路选择和超时
27 | channel的关闭和广播
28 | 任务的取消
29 | Context与任务取消
30 | 只运行一次
31 | 仅需任意任务完成
32 | 所有任务完成
33 | 对象池
34 | sync.pool对象缓存
35 | 单元测试
36 | Benchmark
37 | BDD
38 | 反射编程
39 | 万能程序
40 | 不安全编程
41 | 实现pipe-filter framew...
42 | 实现micro-kernel frame...
43 | 内置JSON解析
44 | easyjson
45 | HTTP服务
46 | 构建RESTful服务
47 | 性能分析工具
48 | 性能调优示例
49 | 别让性能被锁住
50 | GC友好的代码
51 | 高效字符串连接
52 | 面向错误的设计
53 | 面向恢复的设计
54 | Chaos Engineering
55 | 结束语
本节摘要
展开

精选留言(6)

  • 2019-09-09
    没讲context是干嘛的,直接就讲用来取消关联任务,感觉云里雾里的。

    作者回复: context就是用于管理相关任务的上下文,包含了共享值的传递,超时,取消通知
    type Context interface {
        Deadline() (deadline time.Time, ok bool)
        Done() <-chan struct{}
        Err() error
        Value(key interface{}) interface{}
    }
    Deadline会返回一个超时时间,Goroutine获得了超时时间后,例如可以对某些io操作设定超时时间。

    Done方法返回一个信道(channel),当Context被撤销或过期时,该信道是关闭的,即它是一个表示Context是否已关闭的信号。

    当Done信道关闭后,Err方法表明Context被撤的原因。

    Value可以让Goroutine共享一些数据,当然获得数据是协程安全的。但使用这些数据的时候要注意同步,比如返回了一个map,而这个map的读写则要加

    1
  • 2019-04-28
    `cancel()`这里为啥不用向cancel传入ctx,像这样`cancel(ctx)`,我知道`ctx, cancel := context.WithCancel(context.Background())`这里返回的就是不用传参,不明白为啥不用传参,请老师解答一下,谢谢!
    ```
    func TestCancelRelative(t *testing.T){
        // use context.WithCancel() to create cancel context signal, use context.Background() to get context
        ctx, cancel := context.WithCancel(context.Background())
        for i := 0; i < 10; i++ {
            // use context.Context definded a context
            go func(i int, ctx context.Context){
                for {
                    // cancel single task
                    //if isCancel(cancelChan){

                    // cancel relative task
                    if isCancelRelative(ctx){
                        break
                    }
                    time.Sleep(1 * time.Second)
                }
                fmt.Println(i, "done!")
            }(i, ctx)
        }
        cancel()

        // cancel(ctx)
        //raise error: too many arguments in call to cancel, have (context.Context), want()

        time.Sleep(1 * time.Second)
    }
    ```
    展开

    作者回复: 这个cancel就是由相关的context生成的。参考下面的实例代码:
    package cancel_with_ctx

    import (
        "fmt"
        "testing"
    )

    func WithContext(ctx int) (Cancel func()) {
        return func() {
            fmt.Println("The value of ctx is ", ctx)
        }
    }

    func TestWithContext(t *testing.T) {
        cancel := WithContext(10)
        cancel()
        //output: The value of ctx is 10
    }

    1
    1
  • 2019-03-24
    老师,go有类似java中spring clound这种微服务框架吗?

    作者回复: 推荐你一个,简单的
    https://github.com/easierway/service_decorators/blob/master/README.md

    1
  • 2019-08-11
    ctx, cancel := context.WithCancel(context.Background())

        for i := 0; i < 30; i++ {
            go func(i int) {
                for {
                    if isCancelled(ctx) {
                        break
                    } else {
                        // fmt.Println(i, "Not Yet")
                    }
                    time.Sleep(time.Millisecond * 5)
                }
                fmt.Println(i, "Canceled")
            }(i)
        }

    go func(i int) 也可以直接利用闭包特性直接使用ctx,因为for启动多个goroutine时ctx是公用的、不变的。go func(i int) 函数启动时内部的ctx用的是外部ctx,此时内部的ctx由不确定变为确定(由开放到闭合)
    展开
  • 2019-04-16
    蔡超老师你好,在本节的例子中,您是不是没有通过子 context 来创建任务?
  • 2019-03-30
    项目中在用go语言,老师点拨的很好