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

29 | Context与任务取消

蔡超
Mobvista技术副总裁兼首席架构师,前亚马逊(中国)首席软件架构师
55讲 55课时,约700分钟6154
单独订阅¥129
2人成团¥99
3
本节摘要
展开
登录 后留言

精选留言(6)

  • Geek_338030
    没讲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的读写则要加

    2019-09-09
    1
  • 南宫云遥子
    `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
    }

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

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

    2019-03-24
    1
  • 虢国技酱
    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-08-11
  • 喂喂喂
    蔡超老师你好,在本节的例子中,您是不是没有通过子 context 来创建任务?
    2019-04-16
  • 云学
    项目中在用go语言,老师点拨的很好
    2019-03-30
收起评论
看过的人还看
左耳听风

陈皓  网名“左耳朵耗子”,资深技术专家,骨灰级程序员

108讲 | 40618 人已学习

拼团 ¥199 原价 ¥299
趣谈网络协议

刘超  网易研究院云计算技术部首席架构师

51讲 | 39738 人已学习

拼团 ¥79 原价 ¥99
Go语言核心36讲

郝林  《Go并发编程实战》作者,前轻松筹大数据负责人

54讲 | 24208 人已学习

拼团 ¥79 原价 ¥99
MySQL实战45讲

林晓斌  网名丁奇,前阿里资深技术专家

48讲 | 43516 人已学习

拼团 ¥79 原价 ¥99