Go的优雅退出

Go优雅退出/停机以前主要通过signal来实现,当然现在也是通过signal来实现,只是从go 1.16开始,新增了更加友好的API:

复制代码
func NotifyContext(parent context.Context, signals ...os.Signal) (ctx context.Context, stop context.CancelFunc)

该函数该如何使用?

Go 复制代码
package main

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

func main() {
	// 在这里执行异步的其他代码
	go async()
	ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)

	<-ctx.Done()  // 该语句done () 在接收到os.Interrupt时会停止阻塞强制return到下面
	fmt.Println("当前接收到了 os.Interrupt 指令,但是通过了Stop () 来 Reset")
	// 收尾中...
	stop() // 重置 os.Interrupt 信号,允许通过 Ctrl+C 强制退出
    // 执行收尾操作
	time.Sleep(3 * time.Second)
	fmt.Print("收尾成功,程序退出。")
}

func async() {
	for i := 0; i < 100; i++ {
		fmt.Println("我是协程")
		time.Sleep(1 * time.Second)
	}
}

如果使用stop,再次ctrl+c能直接强制退出,因为对应的signal通知已经被重置了:

如果不使用stop,则ctrl+c不能强制退出,假设收尾工作存在死锁等行为,则无法通过Ctrl+C杀掉进程,效果如下:

相关推荐
汤姆yu2 分钟前
基于SpringBoot的人工智能学习网站
spring boot·后端·学习·人工智能学习
山峰哥3 分钟前
现代 C++ 的炼金术:铸就高性能与高可维护性的工程实践
java·开发语言·前端·数据结构·c++
h***34634 分钟前
怎么下载安装yarn
android·前端·后端
小尧嵌入式8 分钟前
QT软件开发知识流程及秒表计时器开发
开发语言·c++·qt·算法
ULTRA??8 分钟前
强化学习算法分类,工具箱AI总结
开发语言·c++·人工智能
GISer_Jing10 分钟前
Next.js 15 全栈开发实战指南
开发语言·javascript·ecmascript
JIngJaneIL12 分钟前
基于Java在线考试管理系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot
JIngJaneIL16 分钟前
基于Java音乐管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot
繁华似锦respect21 分钟前
C++ 智能指针设计模式详解
服务器·开发语言·c++·设计模式·visual studio
郝学胜-神的一滴22 分钟前
Linux进程创建的封装与设计模式应用:结构化分析与实践指南
linux·服务器·开发语言·c++·程序人生·设计模式