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>中.所谓的信号,多指出乎程序员意料的行 ...
随机推荐
- jenkins 参数化构建和增加环境变量
1.参数化构建 2.增加环境变量 prepare an environment for the run,需要安装Environment Injector插件
- 解决ListView 缓存机制带来的显示不正常问题
ListView加载数据原理:系统绘制ListView时,首先会用getCount()函数得到要绘制的这个列表的长度,然后开始逐行绘制.然后调用getView()函数,在这个函数里面首先获得一个Vie ...
- SSL与TLS的区别
SSL(Secure Socket Layer 安全套接层)是基于HTTPS下的一个协议加密层,最初是由网景公司(Netscape)研发,后被IETF(The Internet Engineering ...
- java从键盘输入数,分解质因数,
总结:1.break;的用法 当最小质因数不能被输入的值整除时,需要继续循环.k++. 当然输入的数,本身就是质数时,那么 package com.b; import java.util.Scanne ...
- nc之一:NetCat简介与使用方法
精品学习网考试频道小编应广大考生的需要,特为参加考试的考生策划了“NetCat简介与使用方法”专题等有关资料,供考生参考! 在入侵中它是最经典的工具之一 ,NetCat被所有的网络安全爱好者和研究者称 ...
- [git更新中]版本控制工具git初步使用
逐渐开始写规模稍大的程序, 如果在像以前一样每写完一次保存一个版本, 修改起来太蛋疼了, 而且还会忘记都有修改过哪里, 最终如果写完的话, 各种不方便, 于是便开始接触版本控制工具. 因为是在Linu ...
- jhipster初接触
在Windows7部署之前把几个依赖下了 jdk:1.80 Maven :3.3.9 git:2.14.1 npm:唯一要注意的就是配置一个阿里的镜像,不然慢的你崩溃 Yeoman: npm inst ...
- 如何使32位Linux支持4G以上内存
问题 Linux无法支持超过4G的内存,笔者使用的Linux是CentOS 5,机器是DELL PE1950服务器. 原因: X86系统默认寻址能力的限制 解决办法: 安装具有PAE(物理 ...
- import javax.servlet 出错(真的很管用)
Error: The import javax.servlet cannot be resolved The import javax.servlet.http.HttpServletRequest ...
- django的render的说明
return render(request,"homesite.html",locals()) homesite.html页面中的所有内容都可以被渲染,不论是标签还是js代码,包括 ...