介绍
怎么在golang中使用信号包的通知方法?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
函数声明为:
func 通知(c chan<作用;os.Signal,, sig …os.Signal)
官方描述:
通知函数让信号包将输入信号转发到c。如果没有列出要传递的信号,会将所有输入信号传递到c,否则只传递列出的输入信号。
信号包不会为了向c发送信息而阻塞(就是说如果发送时c阻塞了,信号包会直接放弃):调用者应该保证c有足够的缓存空间可以跟上期望的信号频率。对使用单一信号用于通知的通道,缓存为1就足够了。
示例代码:
ch :=, (chan os.Signal, 1) signal.Notify才能(ch, syscall.SIGHUP,, syscall.SIGQUIT,, syscall.SIGTERM,, syscall.SIGSTOP,, syscall.SIGUSR1) for {才能 ,,,s :=& lt; ch ,,,switch s { ,,,case syscall.SIGQUIT: ,,,,,log.Infof (“SIGSTOP") ,,,,,回来 ,,,case syscall.SIGSTOP: ,,,,,log.Infof (“SIGSTOP") ,,,,,回来 ,,,case syscall.SIGHUP: ,,,,,log.Infof (“SIGHUP") ,,,,,回来 ,,,case syscall.SIGKILL: ,,,,,log.Infof (“SIGKILL") ,,,,,回来 ,,,case syscall.SIGUSR1: ,,,,,log.Infof (“SIGUSR1") ,,,,,回来 ,,,默认值: ,,,,,log.Infof (“default") ,,,,,回来 ,,,} 以前,,}>以上代码告诉信号,将对应的信号通知ch,然后在对循环中针对不同信号做不同的处理,为循环为死循环。
<强>补充:关于信号。通知使用带缓存的频道强>
package 主要 import ( “才能fmt" “才能os" “才能os/signal" ) func main (), {//才能,Set up channel 提醒which 用send signal 通知。//才能,must 我方表示歉意use a buffered channel 或是risk missing 从而信号//才能,if 我们# 39;re not ready 用receive when 从而signal is 发送。 c 才能:=,(chan os.Signal, 1) signal.Notify才能(c, os.Interrupt)//才能,Block until a signal is 收到。 s 才能:=& lt; - c fmt.Println才能(“Got 信号:“,,) }上面一段代码是信号。通知的事例代码,注释说:
我们得使用带缓冲频道
否,则发送信号时我们还没有准备好接收,就有丢失信号的风险
我一直没理解这段注释,于是翻看源码GOROOT美元/src/操作系统/信号/信号。去,有这样一段代码,并注释有“发送但不阻塞”。这里应该就是“有可能丢失信号”的原因了吧。
,,… ,,for c, h :=, range handlers.m { ,,,if h.want (n), { ,,,,,//,send but do not block for 它 ,,,,,select { ,,,,,case c & lt;作用;团体: ,,,,,默认值: ,,,,,} ,,,} ,,} ,,…于是,我写了一段代码进行测试:
package 主要 import ( “才能log" “才能os" “才能os/signal" “才能time" ) func main (), { c 才能:=,(chan os.Signal) signal.Notify才能(c, os.Interrupt) time . sleep才能(* time.Second 5),//,假装,5,秒没准备好接收 s 才能:=& lt; - c log.Println才能(s) }在使用不带缓存的通道时,5秒的睡眠期间无论按多少个控制+ c,睡眠结束都不会打印,也不会退出程序;
在使用带缓存的通道时,只要接收到一个信号情报,在睡眠结束后也就是准备好接收,便会打印并退出程序。
这就是信号。通知使用带缓存通道的作用。
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。
怎么在golang中使用信号包的通知方法