golang捕获ctrl+c退出程序

在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
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Golang中的Gin框架提供了一种简单而强大的方法来构建Web应用程序。与此同时,Golang标准库中的"net/http"包提供了构建WebSocket服务器和客户端的功能。 首先,我们来看一下如何使用Gin和WebSocket构建WebSocket服务器。首先,需要导入相关的包: ```go import ( "github.com/gin-gonic/gin" "github.com/gorilla/websocket" ) ``` 接下来,在Gin中创建一个WebSocket处理函数: ```go func WebSocketHandler(c *gin.Context) { upgrader := websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, } conn, err := upgrader.Upgrade(c.Writer, c.Request, nil) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } for { messageType, message, err := conn.ReadMessage() if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } err = conn.WriteMessage(messageType, message) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } } } ``` 上面的代码创建了一个基本的WebSocket处理函数。它使用WebSocket标准库中的Upgrader结构来处理升级连接并创建一个WebSocket连接。 然后,我们需要在Gin中设置路由来处理WebSocket请求: ```go router := gin.Default() router.GET("/ws", WebSocketHandler) ``` 以上代码将在根路径下创建一个WebSocket处理函数。 接下来,我们来看一下如何使用Golang和Gin构建WebSocket客户端。首先,我们需要导入所需的包: ```go import ( "github.com/gorilla/websocket" "net/http" ) ``` 然后,我们可以使用以下代码来创建一个WebSocket客户端: ```go func main() { c, _, err := websocket.DefaultDialer.Dial("ws://localhost:8080/ws", nil) if err != nil { log.Fatal("dial:", err) } defer c.Close() done := make(chan struct{}) go func() { defer close(done) for { _, message, err := c.ReadMessage() if err != nil { log.Println("read:", err) return } log.Printf("recv: %s", message) } }() ticker := time.NewTicker(time.Second) defer ticker.Stop() for { select { case <-done: return case <-ticker.C: err := c.WriteMessage(websocket.TextMessage, []byte("Hello, Server!")) if err != nil { log.Println("write:", err) return } } } } ``` 上面的代码创建了一个WebSocket客户端,它使用WebSocket标准库中的`DefaultDialer`结构来建立WebSocket连接。 以上就是使用Golang Gin和WebSocket构建WebSocket客户端和服务器的简单示例。这些代码可以帮助我们使用Gin和Golang的标准库来构建强大的Web应用程序,并处理WebSocket通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值