• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

[Go]基础系列二:channel的关闭和广播

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

利用channe关闭任务

package ch21

import (
	"fmt"
	"testing"
	"time"
)

//判断是否有取消任务信号
func isCancelled(cancelChan chan bool) bool {
	select {
	case <-cancelChan:
		return true
	default:
		return false
	}
}

//只要1个协程能关闭
func cancel_1(cancelChan chan bool) {
	cancelChan <- true
}

//所有协程都能关闭
func cancel_2(cancelChan chan bool) {
	close(cancelChan)
}

func TestCancelChannel(t *testing.T) {
	var wg sync.WaitGroup
	cancelChan := make(chan bool, 1)
	for i := 0; i < 5; i++ {
		wg.Add(1)
		go func(i int, ch chan bool) {
			for {
				if isCancelled(cancelChan) {
					fmt.Println(i, "cancelled")
				} else {
					fmt.Println(i, "done")
				}
				wg.Done()
				break
			}
		}(i, cancelChan)
	}
	cancel_2(cancelChan)
	wg.Wait()
}

一般实现方法,通过channel传递关闭信号

缺点:发送信号的个数和需要关闭的协程数量必须一致,耦合性强

cancel_1()执行结果

=== RUN   TestCancelChannel
4 cancelled
0 done
1 done
2 done
3 done
--- PASS: TestCancelChannel (0.00s)

利用channel的广播机制

channel特性,被close之后,channel仍然可读,不但可以读取出已发送的数据,还可以不断的读取零值,
但是如果通过range读取,channel关闭后for循环会跳出:
通过i, ok := <-c可以查看Channel的状态,判断值是零值还是正常读取的值。

使用channel close特性,可以实现广播功能
cancel_2()执行结果

=== RUN   TestCancelChannel
4 cancelled
1 cancelled
0 cancelled
2 cancelled
3 cancelled

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
设置GO环境变量发布时间:2022-07-10
下一篇:
[Go]理解切片slice扩容发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap