golang并发----利用close(channel)实现任务取消

· · 1285 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

所有channel接收者都会在channel关闭时 立刻从阻塞等待中返回 ok值为false
这个广播机制经常被利用进行向多个订阅者同时发送信号 例如退出信号

func dowork() {
    fmt.Println("do work.")
    time.Sleep(time.Second)
}

func iscanceled(cancelchan chan struct{}) bool {
    select {
    case <-cancelchan:
        return true
    default:
        return false
    }
}

// 向cancelch中发送数据只能通知一个goroutine
func cancel1(cancelch chan struct{}) {
    cancelch <- struct{}{}
}

// 关闭cancelch会通知所有从cancelch上接收数据的goroutine
func cancel2(cancelchan chan struct{}) {
    close(cancelchan)
}

func main() {
    cancelchan := make(chan struct{})
    for i := 0; i < 5; i++ {
        go func(i int, cancelch chan struct{}) {
            for {
                if iscanceled(cancelch) {
                    break
                }
                dowork()
            }
            fmt.Println(i, "canceled.")
        }(i, cancelchan)
    }
    cancel2(cancelchan)
    time.Sleep(time.Second * 3)
}


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:

查看原文:golang并发----利用close(channel)实现任务取消

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1285 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传