一、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语言的信号及其应用的更多相关文章

  1. 从源码剖析Go语言基于信号抢占式调度

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/485 本文使用的go的源码15.7 这一次来讲讲基于信号式抢占式调度 ...

  2. QT in VS 多语言实现(中英文切换,每个步骤都有截图,只有UTF8才能让Qt语言家正确读取。先qApp->removeTranslator,然后installTranslator,每个类都要写上槽函数RetranslateUI)

    最近项目需要软件具有中英文双语切换功能,而QT又自带此功能,现将实现方式记录下来. 说到中英文切换,少不了要了解QT的内部编码方式.在此就不详述QT编码方式了,具体可参考 彻底弄懂Qt的编码.只需要记 ...

  3. 一文教你搞懂 Go 中栈操作

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/513 本文使用的go的源码15.7 知识点 LInux 进程在内存布 ...

  4. C语言编程技巧-signal(信号)[转]

    自 http://www.uml.org.cn/c++/200812083.asp 信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念.Linux对信号机制的大致实现方法.如何使用 ...

  5. C语言之捕捉信号

    我们有时候需要在程序中做一些对于用户或内核发出的信号后的处理,如写回文件等善后处理的事情,或者直接忽略信号(当你按Ctrl+C时我压根不理你).下面是一段信号处理的代码(POSIX C): int c ...

  6. 程序设计入门——C语言 第2周编程练习 信号报告(5分)

      2   题目内容: 无线电台的RS制信号报告是由三两个部分组成的: R(Readability) 信号可辨度即清晰度. S(Strength)    信号强度即大小. 其中R位于报告第一位,共分5 ...

  7. 网易云课堂_程序设计入门-C语言_第二周:判断_2信号报告

    2 信号报告(5分) 题目内容: 无线电台的RS制信号报告是由三两个部分组成的: R(Readability) 信号可辨度即清晰度. S(Strength)    信号强度即大小. 其中R位于报告第一 ...

  8. 网易云课堂_C语言程序设计进阶_第二周:指针:取地址运算和指针、使用指针、指针与数组、指针与函数、指针与const、指针运算、动态内存分配_2信号报告

    2 信号报告(5分) 题目内容: 无线电台的RS制信号报告是由三两个部分组成的: R(Readability) 信号可辨度即清晰度. S(Strength)    信号强度即大小. 其中R位于报告第一 ...

  9. C语言信号学习笔记

    在C语言中,对于错误有很多处理方式.然而,今天学习了信号处理,感觉这种处理方式十分灵活,特此记录. 关于信号处理的函数包含于头文件<signal.h>中.所谓的信号,多指出乎程序员意料的行 ...

随机推荐

  1. 13.Selenium不再支持PhantomJS

    在网上查看Selenium教程,发现很多都是使用PhantomJS进行爬虫,故想学习下,下载好了PhantomJS,配好了环境变量,编写代码后发现以下错误 from selenium import w ...

  2. SpringCloud微服务实战——第二章Springboot

    Spring Boot项目工程 src/main/java:主程序入口HelloApplication,可以通过直接运行该类来启动Spring Boot应用. src/main/resources:配 ...

  3. Xcode工具特性

    1.注释 #pragma mark 注释说明#pragma mark - 分类/分组注释说明 2.自定义代码块. 3.多文本编辑框 View>>Assistant Editor

  4. 非常不错的LTE架构讲解

    <LTE系统协议架构---通俗易懂超经典> <3GPP协议导读> <3GPP协议36211-850中文翻译> <LTE全套协议汇总> <NB-IO ...

  5. DCloud-流应用:杂项

    ylbtech-DCloud-流应用:杂项 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   7.返回顶部   8.返回顶部   9.返回 ...

  6. 解决django不能以本机ip地址访问

    在使用django框架来架设网站时,我们测试一般是通过django的开发服务器来完成,但是我们可以看到生成的地址是127.0.0.1:8000这样的话,我们在外网就无法访问了. 解决办法是通过传入第三 ...

  7. 【Java】java.util.Objects 源码学习

    2017-02-10 by 安静的下雪天  http://www.cnblogs.com/quiet-snowy-day/p/6387321.html    本篇概要 Objects 与 Object ...

  8. ABP工作单元

    简介 Unit of work:维护受业务事务影响的对象列表,并协调变化的写入和并发问题的解决.即管理对象的CRUD操作,以及相应的事务与并发问题等.Unit of Work是用来解决领域模型存储和变 ...

  9. 使用LaTeX按IEEE模板写论文时的参考文献管理方法(BibTeX使用小结)

    之前用LaTeX写论文时,参考文献都是手动添加管理的,真是让人很抓狂.所以这次趁着假期,简单看了一下怎么使用BibTeX对参考文献进行管理,这里以IEEE的最新模板为例. 首先说明,我之前用的是MiK ...

  10. 第4章 ZK基本特性与基于Linux的ZK客户端命令行学习 4-2 session的基本原理与create命令的使用

    客户端与服务端之间存在的连接,那么这样的一个连接我们就称之为会话,也就是session.其实就相当于是我们在做JSP或者说是Service的时候,那么服务端是Servlet,客户端使用的是浏览器.浏览 ...