当前播放: 28 | 任务的取消
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 | 结课测试&结束语
28 | 任务的取消

28 | 任务的取消

蔡超
Mobvista技术副总裁兼首席架构师,前亚马逊(中国)首席软件架构师
全集8587
新人首单 ¥29.9 原价 ¥129
5
本节摘要
展开
登录 后留言

精选留言(13)

  • 亚东
    strict{}{},作为赋值的时候,为什么有两个{}?

    作者回复: struct{}表示空结构,第二个表示实例化这个空结构

    2019-03-23
    1
    6
  • 张先森、
    为什么每次都是4 Canceled ,不应该是从这5个协程里面随机选一个吗?
    2019-04-26
    5
    4
  • Aiden
    老师您好,
    func cancel_1传给channel一个值,isCancelled取出一个值返回true容易理解,
    在func cancel_2中,函数close了channel后,为什么isCancelled函数依然返回true?
    我改写了该程序如下,<-cancelCh自己返回的bool值在close的情况下返回的就是false,这里应该怎么理解?
    func TestCancel(t *testing.T) {
    cancelChan := make(chan int, 0)
    for i := 0; i < 5; i++ {
    go func(i int, cancelCh chan int) {
    for {
    if _, ok := <-cancelCh; !ok {//这里ok=false?
    break
    }
    time.Sleep(time.Millisecond * 5)
    }
    fmt.Println(i, "Cancelled")
    }(i, cancelChan)
    }
    close(cancelChan)
    time.Sleep(time.Second * 1)
    }

    作者回复: func isCancelled(cancelChan chan struct{}) bool {
    select {
    case <-cancelChan:
    return true
    default:
    return false
    }
    }

    close(cancelChan)会使所有处于处于阻塞等待状态的,消息接收者(<-cancelChan)返回,所以上面的代码case <-cancelChan分支就会执行下去,返回true

    2019-09-28
    1
    1
  • 李孙科!
    每次都是4 Canceled 是不是说 cancel_1方法 结束的chan 是不是最后一个启动还在跑的协程
    2019-06-04
    1
  • 宝仔
    通过select来判断任务是否被取消的话,下面的代码都被阻塞了老师,这样time.Sleep(time.Millisecond * 5000)还有什么意义,望老师回答

    作者回复: func isCancelled(cancelChan chan struct{}) bool {
    select {
    case <-cancelChan:
    return true
    default:
    return false
    }
    }

    注意一下 select下的default,<-cancelChan阻塞的时候,就会立即运行default分支

    2020-07-20
    1
  • David
    func isCanceled(cancelCh chan struct{}) bool {
    select {
    case <-cancelCh:
    return true
    default:
    return false
    }
    }
    channel close 也会触发select case <-cancelCh 为什么呢

    作者回复: close chan也会使得等待读取操作马上返回

    2020-07-12
  • flow
    应该说明一下:这个示例只是单纯利用广播机制达成任务的取消,这个channel是不负责传输数据的
    2020-05-04
  • Kyushu
    func TestChannel(t *testing.T) {

    channel := make(chan struct{}, 0)

    for i := 0; i < 5; i++ {
    go func() {
    for {
    if isCanceled(ch) {
    break
    }
    time.Sleep(time.Millisecond * 5)
    }
    fmt.Println(i, "cancel")
    }()
    }
    // cancel_1(channel)
    cancel_2(channel)
    time.Sleep(time.Millisecond * 1)
    }
    我没有在go func()中传入参数也是可以运行的,go func(){}()前后的()有什么意义呢?后一个()代表外部传入参数?第一个()代表形参类型所以需要完全声明?

    作者回复: 第一个是方法定义(这里没有入参定义),第二个代表方法调用

    2020-03-13
  • weetime
    这些小例子希望老师能分享一下使用场景,一般情况很少有死循环执行一个任务,等待处理信号,我能想到的应用场景就是做心跳检测,主进程管理子进程,心跳探测异常,所有子进程停止工作。还有多路破解验证码,其他一路成功后,可以通知其他任务停止工作。多路爬虫,搜索,一旦有成功,取消其他任务
    2019-09-13
  • 虢國技醬
    看来老师的课程学会了一个技巧,用test来写一些验证、测试等等demo来运行,以前中是用一个个main包的形式,IDE各种提示main存在等等。而且这样慢慢的对写测试更加熟悉
    2019-08-08
  • 二师兄
    ```go
    func TestCancel(t *testing.T) {
    cancelCh := make(chan struct{}, 0)

    for i := 0; i < 3; i++ {
    go func(i int, cc chan struct{}) {
    for {
    if isCancelled(cc) {
    break
    } else {
    fmt.Println(i, "Not Yet")
    }
    time.Sleep(time.Millisecond * 5)
    }
    fmt.Println(i, "Canceled")
    }(i, cancelCh)
    }
    time.Sleep(time.Millisecond * 100) // ???? 如果加上这一行, 就看不到Canceled的输出
    cancel2(cancelCh)
    }
    ```

    如果我在cancel2调用之前, 增加一个sleep, 则只会输出“Not Yet”, 不会看到“Canceled”, 请问老师这是什么原因呢?

    作者回复: 应该没有问题的,看看你是不是把cancel后面的sleep删除了

    2019-04-28
    1
  • Ian
    func cancel_2(cancelChan chan struct{}){
    close(cancelChan)
    }
    这里,为什么都会收到?没弄明白。本节课也听的有点糊涂。

    作者回复: close有一种类似广播的效果,所有处于接收等待状态的接收者都会立即返回。你在仔细看一遍视频,并试试示例代码就清楚了。

    2019-04-18
  • 忽然之间
    追课进行时:)
    2019-03-22
收起评论
看过的人还看
Go语言核心36讲

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

55讲 | 26277 人已学习

新人首单 ¥19.9 原价 ¥99
数据结构与算法之美

王争  前Google工程师

80讲 | 89664 人已学习

新人首单 ¥29.9 原价 ¥129
MySQL实战45讲

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

49讲 | 58271 人已学习

新人首单 ¥29.9 原价 ¥129
趣谈网络协议

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

51讲 | 45871 人已学习

新人首单 ¥19.9 原价 ¥99