欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

golang 中signal包的Notify用法說(shuō)明

 更新時(shí)間:2021年03月22日 11:37:36   作者:kph_Hajash  
這篇文章主要介紹了golang 中signal包的Notify用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

函數(shù)聲明為:

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

官方描述:

Notify函數(shù)讓signal包將輸入信號(hào)轉(zhuǎn)發(fā)到c。如果沒(méi)有列出要傳遞的信號(hào),會(huì)將所有輸入信號(hào)傳遞到c;否則只傳遞列出的輸入信號(hào)。

signal包不會(huì)為了向c發(fā)送信息而阻塞(就是說(shuō)如果發(fā)送時(shí)c阻塞了,signal包會(huì)直接放棄):調(diào)用者應(yīng)該保證c有足夠的緩存空間可以跟上期望的信號(hào)頻率。對(duì)使用單一信號(hào)用于通知的通道,緩存為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 ,將對(duì)應(yīng)的信號(hào)通知 ch,然后在 for 循環(huán)中針對(duì)不同信號(hào)做不同的處理, for 循環(huán)為死循環(huán)。

補(bǔ)充:關(guān)于 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 的事例代碼,注釋說(shuō):

我們得使用帶緩沖 channel

否則,發(fā)送信號(hào)時(shí)我們還沒(méi)有準(zhǔn)備好接收,就有丟失信號(hào)的風(fēng)險(xiǎn)

我一直沒(méi)理解這段注釋,于是翻看源碼 $GOROOT/src/os/signal/signal.go,有這樣一段代碼,并注釋有“發(fā)送但不阻塞”。這里應(yīng)該就是“有可能丟失信號(hào)”的原因了吧。

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

于是,我寫了一段代碼進(jìn)行測(cè)試:

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 秒沒(méi)準(zhǔn)備好接收
  s := <-c
  log.Println(s)
}

在使用不帶緩存的 channel 時(shí),5 秒的 sleep 期間無(wú)論按多少個(gè) control + c,sleep 結(jié)束都不會(huì)打印,也不會(huì)退出程序;

在使用帶緩存的 channel 時(shí),只要接收到一個(gè) SIGINT ,在 sleep 結(jié)束后也就是準(zhǔn)備好接收,便會(huì)打印并退出程序。

這就是 signal.Notify 使用帶緩存 channel 的作用。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • golang中實(shí)現(xiàn)graphql請(qǐng)求的方法

    golang中實(shí)現(xiàn)graphql請(qǐng)求的方法

    這篇文章主要介紹了如何在golang中實(shí)現(xiàn)graphql請(qǐng)求,在本文中,我們介紹了如何使用gqlgen來(lái)構(gòu)建GraphQL服務(wù),需要的朋友可以參考下
    2023-04-04
  • Golang讀寫二進(jìn)制文件方法總結(jié)

    Golang讀寫二進(jìn)制文件方法總結(jié)

    使用?Golang?的?encoding/gob?包讀寫二進(jìn)制文件非常方便,而且代碼量也非常少,本文就來(lái)通過(guò)兩個(gè)示例帶大家了解一下encoding/gob的具體用法吧
    2023-05-05
  • 一文教你如何快速學(xué)會(huì)Go的struct數(shù)據(jù)類型

    一文教你如何快速學(xué)會(huì)Go的struct數(shù)據(jù)類型

    結(jié)構(gòu)是表示字段集合的用戶定義類型。它可以用于將數(shù)據(jù)分組為單個(gè)單元而不是將每個(gè)數(shù)據(jù)作為單獨(dú)的值的地方。本文就來(lái)和大家聊聊Go中struct數(shù)據(jù)類型的使用,需要的可以參考一下
    2023-03-03
  • golang防止內(nèi)存逃逸的方法小結(jié)

    golang防止內(nèi)存逃逸的方法小結(jié)

    在Go語(yǔ)言中,內(nèi)存逃逸是指在函數(shù)中分配的變量在函數(shù)結(jié)束后仍然被引用,防止內(nèi)存逃逸有助于提高程序的性能,因?yàn)闂I戏峙涞膬?nèi)存可以更快地被回收,本文給大家總結(jié)了一些防止內(nèi)存逃逸的方法,需要的朋友可以參考下
    2024-02-02
  • golang程序進(jìn)度條實(shí)現(xiàn)示例詳解

    golang程序進(jìn)度條實(shí)現(xiàn)示例詳解

    這篇文章主要為大家介紹了golang程序?qū)崿F(xiàn)進(jìn)度條示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • VSCode安裝go相關(guān)插件失敗的簡(jiǎn)單解決方案

    VSCode安裝go相關(guān)插件失敗的簡(jiǎn)單解決方案

    這篇文章主要給大家介紹了關(guān)于VSCode安裝go相關(guān)插件失敗的簡(jiǎn)單解決方案,VSCode是我們開(kāi)發(fā)go程序的常用工具,最近安裝的時(shí)候遇到了些問(wèn)題,需要的朋友可以參考下
    2023-07-07
  • Go數(shù)組與切片輕松掌握

    Go數(shù)組與切片輕松掌握

    在Java的核心庫(kù)中,集合框架可謂鼎鼎大名:Array、List、Set等等,隨便拎一個(gè)出來(lái)都值得開(kāi)發(fā)者好好學(xué)習(xí)如何使用甚至是背后的設(shè)計(jì)源碼。雖然Go語(yǔ)言沒(méi)有如此豐富的容器類型,但也有一些基本的容器供開(kāi)發(fā)者使用,接下來(lái)讓我們認(rèn)識(shí)一下這些容器類型吧
    2022-11-11
  • Go構(gòu)建WiFi局域網(wǎng)聊天室示例詳解

    Go構(gòu)建WiFi局域網(wǎng)聊天室示例詳解

    這篇文章主要為大家介紹了Go構(gòu)建WiFi局域網(wǎng)聊天室示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • GO語(yǔ)言基本類型String和Slice,Map操作詳解

    GO語(yǔ)言基本類型String和Slice,Map操作詳解

    這篇文章主要為大家介紹了GO語(yǔ)言基本類型String和Slice,Map操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Golang利用casbin實(shí)現(xiàn)權(quán)限驗(yàn)證詳解

    Golang利用casbin實(shí)現(xiàn)權(quán)限驗(yàn)證詳解

    Casbin是一個(gè)強(qiáng)大的、高效的開(kāi)源訪問(wèn)控制框架,其權(quán)限管理機(jī)制支持多種訪問(wèn)控制模型,Casbin只負(fù)責(zé)訪問(wèn)控制。本文將利用casbin實(shí)現(xiàn)權(quán)限驗(yàn)證功能,需要的可以參考一下
    2023-02-02

最新評(píng)論