网络编程
位置:首页>> 网络编程>> Go语言>> golang 中signal包的Notify用法说明

golang 中signal包的Notify用法说明

作者:kph_Hajash  发布时间:2023-07-19 19:06:36 

标签:golang,signal,Notify

函数声明为:


func Notify(c chan<- os.Signal, sig ...os.Signal)

官方描述:

Notify函数让signal包将输入信号转发到c。如果没有列出要传递的信号,会将所有输入信号传递到c;否则只传递列出的输入信号。

signal包不会为了向c发送信息而阻塞(就是说如果发送时c阻塞了,signal包会直接放弃):调用者应该保证c有足够的缓存空间可以跟上期望的信号频率。对使用单一信号用于通知的通道,缓存为1就足够了。

示例代码:


ch := make(chan os.Signal, 1)
 signal.Notify(ch, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGSTOP, syscall.SIGUSR1)
 for {
   s := <-ch
   switch s {
   case syscall.SIGQUIT:
     log.Infof("SIGSTOP")
     return
   case syscall.SIGSTOP:
     log.Infof("SIGSTOP")
     return
   case syscall.SIGHUP:
     log.Infof("SIGHUP")
     return
   case syscall.SIGKILL:
     log.Infof("SIGKILL")
     return
   case syscall.SIGUSR1:
     log.Infof("SIGUSR1")
     return
   default:
     log.Infof("default")
     return
   }
 }

以上代码告诉 signal ,将对应的信号通知 ch,然后在 for 循环中针对不同信号做不同的处理, for 循环为死循环。

补充:关于 signal.Notify 使用带缓存的 channel


package main
import (
 "fmt"
 "os"
 "os/signal"
)
func main() {
 // Set up channel on which to send signal notifications.
 // We must use a buffered channel or risk missing the signal
 // if we're not ready to receive when the signal is sent.
 c := make(chan os.Signal, 1)
 signal.Notify(c, os.Interrupt)
 // Block until a signal is received.
 s := <-c
 fmt.Println("Got signal:", s)
}

上面一段代码是 signal.Notify 的事例代码,注释说:

我们得使用带缓冲 channel

否则,发送信号时我们还没有准备好接收,就有丢失信号的风险

我一直没理解这段注释,于是翻看源码 $GOROOT/src/os/signal/signal.go,有这样一段代码,并注释有“发送但不阻塞”。这里应该就是“有可能丢失信号”的原因了吧。


 ...
 for c, h := range handlers.m {
   if h.want(n) {
     // send but do not block for it
     select {
     case c <- sig:
     default:
     }
   }
 }
 ...

于是,我写了一段代码进行测试:


package main
import (
 "log"
 "os"
 "os/signal"
 "time"
)
func main() {
 c := make(chan os.Signal)
 signal.Notify(c, os.Interrupt)
 time.Sleep(time.Second * 5) // 假装 5 秒没准备好接收
 s := <-c
 log.Println(s)
}

在使用不带缓存的 channel 时,5 秒的 sleep 期间无论按多少个 control + c,sleep 结束都不会打印,也不会退出程序;

在使用带缓存的 channel 时,只要接收到一个 SIGINT ,在 sleep 结束后也就是准备好接收,便会打印并退出程序。

这就是 signal.Notify 使用带缓存 channel 的作用。

来源:https://blog.csdn.net/chuanglan/article/details/80750119

0
投稿

猜你喜欢

  • 在HTML中,我们设置border=”1″ 时,表格边框实际大小是2px,那如果我们要做成1px的细线表格要怎么办?以前在做1px的表格的时
  • EcmaScript正則表達式( 深入淺出系列之淺出 ^_^ )在线正则表达式测试:http://www.aspxhome.com/RegE
  • 本文介绍的函数其实是PHP手册上本来就有的,但是由于这些函数独立性较强,查找不易,所以单独介绍一下,方便查阅。 1. 获取所有可用的模块 -
  • Debug Textarea这个东西是在线写 js 脚本的时候,用来即时查错的东西!也就是,当发现所编写的脚本有问题的时候会有相应的提示,并
  • 我准备在ASP中连接MYSQL了,请问如何做?首先要正确安装MYSQLX,装好之后,可调用以下程序即可正常访问MYSQL:<%@&nb
  • 1、选取最适用的字段属性MySQL 可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建
  • 报错:Uncaught SyntaxError: Unexpected token o in JSON at position 1at JS
  • 如何利用Image Data Type从数据库中读取图片,并在主页中显示图形?然后,写如下代码:< % @&nbs
  • 今天一个项目上需要,修改了一些属性,测试成功。<!--#include file="conn.asp"-
  • <P><HTML><HEAD><TITLE>javascriptboy</TITLE&
  • 见下表:序号保留字序号保留字序号保留字1ADD80ESCAPE159OR2ABSOLUTE81EXCEPT160ORDER3ACTION82
  • 因为有个老Yashica相机机身,前一阵忍不住想配几个标准镜头。到国内购物网站以及摄影器材交流论坛上看了看,发现不仅很少,价格不实在,而且品
  • 简单低级的爬虫速度快,伪装度低,如果没有反爬机制,它们可以很快的抓取大量数据,甚至因为请求过多,造成服务器不能正常工作。而伪装度高的爬虫爬取
  • 负责为网页编程语言提供标准化服务的W3C组织(World Wide Web Consortium)近日开始修改超文本标记语言的定义,计划为该
  • abs(number) 返回绝对值。 array(arglist) 创建一个数组。 asc(string) 返回字符串第一个字符的ansi码
  • 上文: 《IE7的web标准之道——1:前言(兼目录)》IE历来被web标准的拥护者所诟病,而当FireFox横空出世以后,更多的网页制作者
  • 这个代码不是很完善,能实现基本的功能;另外有个问题,就是divOpenWin层的定位问题:发现如果其属性设置成display:none,那么
  • 1.网页背景色的设置 犯错机率:很大普遍性:较广犯错可能性:懒/不知道约2年前我曾发现21cn上出现过一次没有设置背景色的情况,当时我用Em
  • 以这两个域名为例:http://www.knowsky.com/http://code.knowsky.com/这两个域名都是绑在同一个空间
  • 当今,有一点可以肯定的是,设计的领域在扩大,这是一个需要设计的世界。拒最新的统计资料显示,中国目前已有正规的设计学院教学机构700多所,并且
手机版 网络编程 asp之家 www.aspxhome.com