怎么在golang中使用信号包的通知方法

  介绍

怎么在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中使用信号包的通知方法