• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
孤独的DNA
博客园    首页    新随笔    联系   管理    订阅  订阅

go在linux捕捉退出信号,优雅退出任务

package main

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

func main() {
	c := make(chan os.Signal, 1)                                                     //创建一个接收信号量的管道
	exitVar := false                                                                 //定义一个变量来处理进程退出的问题
	signal.Notify(c, os.Interrupt, syscall.SIGTERM, syscall.SIGHUP, syscall.SIGQUIT) //监听linux的信号

	grp := sync.WaitGroup{}
	for i := 0; i < 10; i++ {
		grp.Add(1)
		go HandleData(i, &grp, &exitVar) //处理业务的方法
	}
	//退出的时候,index变成false
	sig := <-c
	exitVar = true
	fmt.Println("task is exit", sig)
	grp.Wait()

}

func HandleData(num int, group *sync.WaitGroup, exit *bool) {
	for {
		if *exit {
			break
		}
		//这里可以放一些任务
		fmt.Println("我是处理任务协程:", num)
		time.Sleep(1 * time.Second)
	}

	fmt.Println("收到退出信号处理退出逻辑")
	group.Done()
}

  

posted @ 2024-06-27 10:01  孤独的DNA  阅读(28)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3