[Go] 基础系列二:channel的关闭和广播
利用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
[Go] 基础系列二:channel的关闭和广播的更多相关文章
- 【C++自我精讲】基础系列二 const
[C++自我精讲]基础系列二 const 0 前言 分三部分:const用法.const和#define比较.const作用. 1 const用法 const常量:const可以用来定义常量,不可改变 ...
- Go基础系列:channel入门
Go channel系列: channel入门 为select设置超时时间 nil channel用法示例 双层channel用法示例 指定goroutine的执行顺序 channel基础 chann ...
- Java基础系列二:Java泛型
该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 一.泛型概述 1.定 ...
- 你所不知道的ASP.NET Core MVC/WebApi基础系列 (二)
转自博客:https://www.cnblogs.com/CreateMyself/p/10604293.html 前言 本节内容,我们来讲讲.NET Core当中的模型绑定系统.模型绑定原理.自定义 ...
- es6基础系列二:Number
es6中关于Number类型的变化,主要有以下几点 Number.isInteger(新增,判断是否为整数) Number.EPSILON(新增,判断是否可忽略的误差) Number.MAX_SAFE ...
- 【网络基础系列二】BOOTP、DHCP协议
BOOTP 含义:BOOT Protocol,引导协议 作用:引导无盘计算机或者第一次启动的计算机获取以下网络配置信息: 主机的IP地址.子网掩码 路由器(网关)的IP地址 DNS服务器IP地址 C/ ...
- 夯实基础系列四:Linux 知识总结
前言 前三节内容传送门: 夯实基础系列一:Java 基础总结 夯实基础系列二:网络知识总结 夯实基础系列三:数据库知识总结 现在很多公司项目部署都使用的是 Linux 服务器,互联网公司更是如此.对于 ...
- Mina 系列(二)之基础
Mina 系列(二)之基础 Mina 使用起来多么简洁方便呀,就是不具备 Java NIO 的基础,只要了解 Mina 常用的 API,就可以灵活使用并完成应用开发. 1. Mina 概述 首先,看 ...
- C#基础系列——委托和设计模式(二)
前言:前篇 C#基础系列——委托实现简单设计模式 简单介绍了下委托的定义及简单用法.这篇打算从设计模式的角度去解析下委托的使用.我们知道使用委托可以实现对象行为(方法)的动态绑定,从而提高设计的灵活性 ...
随机推荐
- centos7 GNOME 安装微信客户端
写在前边 最近新装了一个 centos7 GNOME 系统,用了很久了 win,突然转换 linux 桌面版,觉得焕然一新,给搬砖生活增添了一份新意 ~ 先看一下效果图: 怎么弄呢? 下载最新版本 t ...
- C++复制构造函数,类型转换构造函数,析构函数,引用,指针常量和常量指针
复制构造函数形如className :: className(const &) / className :: className(const className &)后者能以常 ...
- 关于Vue-ElementUI修改默认样式不成功问题解决
Element是一个很好用的组件库,但是有时候我们需要修改一些组件的样式以满足我们自己的需求. 我们用浏览器调试找到相应的class,在本地重写这个class时,发现修改不成功. 这是因为在Vue文件 ...
- python火爆背后
Python是一种非常好的编程语言,也是目前非常有前途的一门学科.有很多工作要做,而且薪水也很高,这已经成为每个人进入IT行业的首选.那么Python能做什么呢?为什么这么热? 那么Python能做什 ...
- 加快JavaScript加载和执行效率
JavaScript 在浏览器中的性能成为开发者所面临的最重要的可用性问题.而这个问题又因 JavaScript 的阻塞特性变的复杂,也就是说当浏览器在执行 JavaScript 代码时,不能同时做其 ...
- python 复制列表
python的变量仅仅是指向对象的标签,所以在操作列表的时候,list1 = list2这种做法只会复制一个标签,然后指向对象,并非生成一个新的对象. 大致有5中方法可以复制列表: a = [1,2, ...
- ArcCatalog连接数据库报错
ArcCatalog连接数据库报错: Failed to connect to database. Cannot connect to database because the database cl ...
- 网络基础 InetAddress
IP地址是IP使用的32位(IPv4)或者128位(IPv6)位无符号数字,它是传输层协议TCP,UDP的基础.InetAddress是Java对IP地址的封装,在java.net中有许多类都使用到了 ...
- MongoDB的删除操作
1.MongoDB 删除数据库的语法格式如下: db.dropDatabase() > show dbs admin .000GB config .000GB local .000GB sda ...
- Vue路由嵌套和命名视图
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...