golang捕获ctrl+c退出程序

golang 专栏收录该内容
10 篇文章 0 订阅

在golang当中如何捕获ctrl+c命令,让程序有序的的退出?

首先测试一段golang代码,捕获SIGINT和SIGKILL

c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt, os.Kill)

s := <-c
fmt.Println("Got signal:", s)

在多goroutines当中如何退出?我们假设有一个生产者,一个消费者,这个时候应该让生产者去捕获消息,关闭channel,生产者退出;消费者感知到channel关闭,消费者退出。

package main

import (
    "time"
    "fmt"
    "os"
    "os/signal"
    "sync"
)

var c chan os.Signal
var msgQueue chan *string
var wg sync.WaitGroup

func Producer(){
    i := 0
    LOOP:
    for{
        select {
        case s := <-c:
            fmt.Println()
            fmt.Println("Producer | get", s)
            break LOOP
        default:
        }

        i ++
        s := fmt.Sprintf("work-%d", i)
        fmt.Println("Producer | produce", s)
        msgQueue <- &s
        time.Sleep(500 * time.Millisecond)
    }

    close(msgQueue)
    fmt.Println("Producer | close channel, exit")
    wg.Done()
}

func Consumer(){
    for m := range msgQueue{
        if m != nil{
            fmt.Println("Consumer | consume", *m)
        }else{
            fmt.Println("Consumer | channel closed")
            break
        }
    }
    fmt.Println("Consumer | exit")
    wg.Done()
}

func main(){
    c = make(chan os.Signal, 1)
    msgQueue = make(chan *string, 1000)
    signal.Notify(c, os.Interrupt, os.Kill)

    //pruducer
    wg.Add(1)
    go Producer()

    //consumer
    wg.Add(1)
    go Consumer()

    wg.Wait()
}

运行结果:

Producer | produce work-1
Consumer | consume work-1
Producer | produce work-2
Consumer | consume work-2
Producer | produce work-3
Consumer | consume work-3
Producer | produce work-4
Consumer | consume work-4

Producer | get interrupt
Producer | close channel, exit
Consumer | exit

参考:
1. http://www.oschina.net/translate/golang-graceful-stop?lang=eng

  • 1
    点赞
  • 0
    评论
  • 3
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

白日梦想

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值