go语言的信号及其应用
一、signal包
1、Notify函数
func Notify(c chan<- os.Signal, sig ...os.Signal)
说明:Notify函数让signal包将输入信号转发到c。如果没有列出要传递的信号,会将所有输入信号传递到c;否则只传递列出的输入信号。且当c阻塞时(缓冲满了),os的输入信号将被丢弃。
2、Stop函数
func Stop(c chan<- os.Signal)
说明:Stop函数让signal包停止向c转发信号。它会取消之前使用c调用的所有Notify的效果。当Stop返回后,会保证c不再接收到任何信号。
二、signal在Web服务中的应用(优雅的退出服务进程)
1、当服务接收到外部输入的终止信号时,应该保证相应的资源得到释放。
2、首先创建信号的处理器,以及信号集结构体,用于对不同信号实现不同处理,代码示例如下:
type handler func(sig os.Signal, arg interface{}) //处理器函数类型
// 信号集结构体
type sigSet struct {
set map[os.Signal]signalHandler
}
// 注册对应的信号及处理器函数
func (sigs *sigSet) register(s os.Signal, h handler) {
if _, found := sigs.m[s]; !found {
sigs.m[s] = h
}
}
// 对象相应的信号进行处理操作
func (sigs *sigSet) handle(sig os.Signal, arg interface{}) (err error) {
if _, found := sigs.m[sig]; found {
sigs.m[sig](sig, arg) //执行指定的处理函数
return nil
} else {
return fmt.Errorf("no handler for signal %v", sig)
}
}
3、停止服务器的入口函数
func StopServer(release func()) {
sigMap := new(sigSet)
sigMap.set = make(map[os.Signal]signalHandler) Handler := func(sig os.Signal, arg interface{}) {
release() //释放资源,并开始退出程序
os.Exit()
}
sigMap.register(syscall.SIGINT, Handler) //注册ctrl+c的外部输入信号,可注册多个其他信号及处理函数
// 循环等待外部输入信号
for {
s := make(chan os.Signal)
signal.Notify(s) //将外部输入信号都传递给s管道
sig := <-s //阻塞,直至s中管道有信号
err := sig.handle(sig, nil)
if err != nil {
fmt.Errorf("unknown signal received %v", sig)
}
}
}
4、主函数的实现,创建一个goruotine来执行服务器停止函数
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
stop := make(chan bool, )
go StopServer( func() {
service.Stop() //关闭与存储相关的连接资源
stop <- true
})
service.Start() //启动相关web服务
<- stop //阻塞,直到stop管道被赋值
fmt.Println("service is over")
}
go语言的信号及其应用的更多相关文章
- 从源码剖析Go语言基于信号抢占式调度
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/485 本文使用的go的源码15.7 这一次来讲讲基于信号式抢占式调度 ...
- QT in VS 多语言实现(中英文切换,每个步骤都有截图,只有UTF8才能让Qt语言家正确读取。先qApp->removeTranslator,然后installTranslator,每个类都要写上槽函数RetranslateUI)
最近项目需要软件具有中英文双语切换功能,而QT又自带此功能,现将实现方式记录下来. 说到中英文切换,少不了要了解QT的内部编码方式.在此就不详述QT编码方式了,具体可参考 彻底弄懂Qt的编码.只需要记 ...
- 一文教你搞懂 Go 中栈操作
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/513 本文使用的go的源码15.7 知识点 LInux 进程在内存布 ...
- C语言编程技巧-signal(信号)[转]
自 http://www.uml.org.cn/c++/200812083.asp 信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念.Linux对信号机制的大致实现方法.如何使用 ...
- C语言之捕捉信号
我们有时候需要在程序中做一些对于用户或内核发出的信号后的处理,如写回文件等善后处理的事情,或者直接忽略信号(当你按Ctrl+C时我压根不理你).下面是一段信号处理的代码(POSIX C): int c ...
- 程序设计入门——C语言 第2周编程练习 信号报告(5分)
2 题目内容: 无线电台的RS制信号报告是由三两个部分组成的: R(Readability) 信号可辨度即清晰度. S(Strength) 信号强度即大小. 其中R位于报告第一位,共分5 ...
- 网易云课堂_程序设计入门-C语言_第二周:判断_2信号报告
2 信号报告(5分) 题目内容: 无线电台的RS制信号报告是由三两个部分组成的: R(Readability) 信号可辨度即清晰度. S(Strength) 信号强度即大小. 其中R位于报告第一 ...
- 网易云课堂_C语言程序设计进阶_第二周:指针:取地址运算和指针、使用指针、指针与数组、指针与函数、指针与const、指针运算、动态内存分配_2信号报告
2 信号报告(5分) 题目内容: 无线电台的RS制信号报告是由三两个部分组成的: R(Readability) 信号可辨度即清晰度. S(Strength) 信号强度即大小. 其中R位于报告第一 ...
- C语言信号学习笔记
在C语言中,对于错误有很多处理方式.然而,今天学习了信号处理,感觉这种处理方式十分灵活,特此记录. 关于信号处理的函数包含于头文件<signal.h>中.所谓的信号,多指出乎程序员意料的行 ...
随机推荐
- dockerfile mysql
FROM centos6.6-mysql5.5:0.0.4 MAINTAINER syberos:wangmo RUN mv /etc/my.cnf /etc/my.cnf.bak ADD my.cn ...
- Oracle 闪回归档(Flashback Data Archive)
--检查权限 SELECT * FROM dba_sys_privs WHERE privilege LIKE '%FLASH%'; --设置权限 GRANT dba TO testuser;--设置 ...
- JSF通过超链接传递参数到控制层
JSF通过超链接传输数据到控制层可以分为三个步骤: 1.首先将数据加入到超链接中.通过<h:link>标签加入一个超链接,然后加入<f:param>标签加入参数.示例代码如下: ...
- [转载]create_proc_read_entry中函数的说明
原型: struct proc_dir_entry *create_proc_read_entry (const char *name, mode_t mode, struct proc_dir_en ...
- 开发工具:sublime text3安装Vue语法高亮插件
一.将插件克隆到Sublime的packages目录 1.下载并解压插件(或直接git命令clone),得到vue-syntax-highlight-master文件夹 插件地址:https://gi ...
- 图解缓存淘汰算法二之LFU
1.概念分析 LFU(Least Frequently Used)即最近最不常用.从名字上来分析,这是一个基于访问频率的算法.与LRU不同,LRU是基于时间的,会将时间上最不常访问的数据淘汰;LFU为 ...
- 01-19asp.net基础--网站登录及验证
第一步: 1)首先使用“CodeSmith”将Examinee类实体化,并生成实体类连接数据库的方法,存在解决方案下的“App_Code”文件夹下. 修改一下连接某个数据库: private SqlC ...
- 配置镜像yum源--解决RHN not available的问题
由于RHN服务是收费的,在安装redhat系统时,自带的yum可能不能使用.中国有很多好用的镜像源,我们可以把yum源更改到国内镜像源上,步骤如下: 一.卸载本地yum #rpm –qa|grep y ...
- Bind和Eval的不同用法 (转)
今天在用DataList的模板列的时候习惯性地像在03中那样去给模板列的绑定字段加个处理函数: < asp:Label ID = " Label1 " runat = &qu ...
- solr安装部署、solr测试创建core、用solrj 访问solr(索引和搜索)
一.安装solr4.8: 1.把apache-solr-4.8.1\example\webapps下的solr.war文件拷贝到Tomcat下的Tomcat7.0\webapps目录下,tomcat启 ...