返回顶部
首页 > 资讯 > 后端开发 > GO >怎么在golang中使用signal包的Notify方法
  • 865
分享到

怎么在golang中使用signal包的Notify方法

2023-06-14 07:06:36 865人浏览 独家记忆
摘要

怎么在golang中使用signal包的Notify方法?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。函数声明为:func Notify(c 

怎么在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 mainimport (  "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 mainimport (  "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 的作用。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网GO频道,感谢您对编程网的支持。

您可能感兴趣的文档:

--结束END--

本文标题: 怎么在golang中使用signal包的Notify方法

本文链接: https://lsjlt.com/news/268856.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么在golang中使用signal包的Notify方法
    怎么在golang中使用signal包的Notify方法?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。函数声明为:func Notify(c ...
    99+
    2023-06-14
  • golang 中signal包的Notify用法说明
    函数声明为: func Notify(c chan<- os.Signal, sig ...os.Signal) 官方描述: Notify函数让signal包将输入信号转...
    99+
    2024-04-02
  • Java中怎么正确使用wait-notify方法
    本篇内容介绍了“Java中怎么正确使用wait-notify方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. sleep(long n...
    99+
    2023-06-29
  • 浅析Python中signal包的使用
    在liunx系统中要想每隔一分钟执行一个命令,最普遍的方法就是crontab了,如果不想使用crontab,经同事指点在程序中可以用定时器实现这种功能,于是就开始摸索了,发现需要一些信号的知识... 查看你...
    99+
    2022-06-04
    Python signal
  • golang包的使用方法
    使用Go语言包的步骤有以下6步:1、创建一个新的包;2、在包的目录中,编写相应的代码文件;3、以大写字母开头使其可以被其他包导入并使用;4、在需要使用包中的代码时,使用”import "<包路径>"“的形式导入当前代码文件中;5...
    99+
    2023-12-18
    golang包 go语言 Golang
  • Java 中Object的wait() notify() notifyAll()方法使用
    Java 中Object的wait() notify() notifyAll()方法使用一、前言  对于并发编程而言,除了Thread以外,对Object对象的wati和notify对象也应该深入了解其用法,虽然知识点不多。二、线程安全基本...
    99+
    2023-05-31
    java object wait()
  • golang中strings包的Replace使用方法
    这篇文章将为大家详细讲解有关golang中strings包的Replace使用方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。函数声明:func Trim(s string...
    99+
    2023-06-14
  • 详解Golang中time包的使用方法
    Golang作为移动互联网时代的代表性编程语言,在时间处理方面有着独具特色的实现方式。本文将介绍Golang中的time包,豁然开朗的实现方式。time包在Golang中,我们可以通过time包来进行时间相关的操作。time包提供了两种时间...
    99+
    2023-05-14
  • 怎么在Java中正确使用wait, notify和notifyAll
    这篇文章将为大家详细讲解有关怎么在Java中正确使用wait, notify和notifyAll,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。wait, notify 和 notifyAll,这些在多线程...
    99+
    2023-06-17
  • 怎么在golang中使用import自定义包
    今天就跟大家聊聊有关怎么在golang中使用import自定义包,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。golang适合做什么golang可以做服务器端开发,但golang很适...
    99+
    2023-06-14
  • Linux中signal()函数怎么使用
    本篇文章和大家了解一下Linux中signal()函数怎么使用。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。signal() 函数无意中看到了 signal() 函数,感觉对这个函数的原型有诸多疑惑,学习一下,顺便分享。...
    99+
    2023-08-03
  • Golang中的面向方法怎么使用
    这篇文章主要介绍了Golang中的面向方法怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Golang中的面向方法怎么使用文章都会有所收获,下面我们一起来看看吧。一、Golang中的方法方法是Golang...
    99+
    2023-07-05
  • golang包怎么使用
    Golang是一种高效、快速和稳定的编程语言,在软件开发领域受到广泛关注和应用。相比其他语言,golang有许多优势,其中之一是它丰富的标准库,这些库提供了开发者需要的各种工具和资源。在本文中,我们将详细介绍golang的包和如何使用这些包...
    99+
    2023-05-15
  • Golang中的方法怎么定义和使用
    这篇文章主要介绍“Golang中的方法怎么定义和使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Golang中的方法怎么定义和使用”文章能帮助大家解决问题。方法语法在Golang中,方法定义的语法...
    99+
    2023-07-05
  • golang expect包怎么使用
    本文小编为大家详细介绍“golang expect包怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“golang expect包怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。这里如果使用su切换用...
    99+
    2023-06-27
  • bytes.Buffer怎么在golang中使用
    bytes.Buffer怎么在golang中使用?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。go适合做什么go是golang的简称,而golang可以做服务器...
    99+
    2023-06-14
  • Ring怎么在Golang中使用
    今天就跟大家聊聊有关Ring怎么在Golang中使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。golang的优点golang是一种编译语言,可以将代码编译为机器代码,编译后的二进...
    99+
    2023-06-14
  • 如何在Golang中使用方法注释
    在Golang中,注释是一种很重要的代码文档形式,给别人或自己日后看代码时提供详细的说明和解释。注释帮助我们快速理解代码,并准确地了解代码的目的和功能,特别是当我们需要修改或扩展代码时。本文将介绍如何在Golang中使用方法注释,方法注释是...
    99+
    2023-05-14
  • 为什么wait和notify必须放在synchronized中使用
    目录wait/notify基础使用wait/notify和synchronized一起用?原因分析wait和notify问题复现总结前言: 在多线程编程中,wait 方法是让当前线程...
    99+
    2024-04-02
  • golang 中 recover()的使用方法
    Recover 是一个Go语言的内建函数,可以让进入宕机流程中的 goroutine 恢复过来,recover 仅在延迟函数 defer 中有效,在正常的执行过程中,调用 recov...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作