博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【golang】signal和chan结合使用
阅读量:6281 次
发布时间:2019-06-22

本文共 1094 字,大约阅读时间需要 3 分钟。

hot3.png

golang中对信号的处理主要使用os/signal包中的两个方法:一个是notify方法用来监听收到的信号;一个是 stop方法用来取消监听。 接下来举个signal和chan结合使用的例子

func main() {	shutdown := make(chan struct{})	go func() {		select {		case c := <-shutdown:			fmt.Println("shutdown", c)			return		}	}()	c := make(chan os.Signal)	signal.Notify(c, syscall.SIGINT, syscall.SIGQUIT)	s := <-c	close(shutdown)	fmt.Println("Got signal:", s)	time.Sleep(100)}

输出结果:

shutdown {}Got signal: interrupt

上述过程:1.首先系统接收到ctrl+c的指令,signal接收到该指令。

2.signal执行 原先堵塞的 s:=<-c 这步骤,并关闭 shutdown 通道。

3.打印 相关消息

4.若去掉  time.sleep(100) 则有可能上述协程未执行完成,程序就不输出。

上述知识点:signal,chan,携程

 

channel

关闭channel

ch := make(chan bool) close(ch) close(ch)  // 这样会panic的,channel不能close两次 

向已经关闭的channel写数据

ch := make(chan string) close(ch) ch <- "good" // 会panic的

从已经关闭的channel读取数据 

需要分两种情况: 

  1. 无缓冲channel或者缓冲channel已经读取完毕
  2. 缓冲channel未读取完毕,可以继续读取channel中的剩余的数据

//无缓冲channel

ch := make(chan string) close(ch) i := <- ch // 不会panic, i读取到的值是空 "",  如果channel是bool的,那么读取到的是false 

判断channel是否关闭

i, ok := <- ch if ok {     println(i) } else {     println("channel closed") } 

 

转载于:https://my.oschina.net/mickelfeng/blog/1591741

你可能感兴趣的文章
LINUX常用命令
查看>>
百度云盘demo
查看>>
概率论与数理统计习题
查看>>
初学structs2,简单配置
查看>>
Laravel5.0学习--01 入门
查看>>
时间戳解读
查看>>
sbin/hadoop-daemon.sh: line 165: /tmp/hadoop-hxsyl-journalnode.pid: Permission denied
查看>>
@RequestMapping 用法详解之地址映射
查看>>
254页PPT!这是一份写给NLP研究者的编程指南
查看>>
《Data Warehouse in Action》
查看>>
String 源码浅析(一)
查看>>
Spring Boot 最佳实践(三)模板引擎FreeMarker集成
查看>>
Fescar 发布 0.2.3 版本,支持 Redis 和 Apollo
查看>>
Google MapReduce到底解决什么问题?
查看>>
CCNP-6 OSPF试验2(BSCI)
查看>>
Excel 2013 全新的图表体验
查看>>
openstack 制作大于2TB根分区自动扩容的CENTOS镜像
查看>>
Unbuntu安装遭遇 vmware上的Easy install模式
查看>>
几个常用的ASP木马
查看>>
python分析postfix邮件日志的状态
查看>>