龙空技术网

go语言实现优雅退出:graceful shutdown

甲鲲 137

前言:

此时兄弟们对“c语言输入数字退出程序是什么意思啊视频”可能比较注重,大家都需要学习一些“c语言输入数字退出程序是什么意思啊视频”的相关资讯。那么小编在网摘上网罗了一些对于“c语言输入数字退出程序是什么意思啊视频””的相关内容,希望姐妹们能喜欢,你们快快来学习一下吧!

为什么需要优雅退出?程序又是如何退出的?如果不进行“优雅退出”,任由没有处理的直接退出,会造成什么结果?来看看程序退出时发生了什么,还有如何处理go语言的优雅的退出。

程序退出

程序运行过程中如果收到了系统给程序的关闭信号(signal),go程序会进行一系列的操作比如:关闭协程、关闭通道、释放文件句柄等,最后会执行runtime.Exit()退出程序。

为什么需要“优雅退出”?

在程序正常退出的时候,go和操作系统会帮助我们释放程序所使用的资源。但是如果程序中有一个协程正在处理一些任务(比如程序内部实现了一个任务列队),这时候退出程序,我们是希望将处理中任务完成后再退出程序。因为此时直接退出程序会造成不可预料的结果。

所以就需要在程序退出的时候进行“优雅退出”,在程序收到关闭信号后,完成正在处理的任务再退出,以保证关闭操作不会造成数据损坏。

go如何进行优雅退出

先看一个简单例子:

先来看下这段代码有什么作用:

首先创建了一个通道,类型是os.Signal,用于接收系统信号

使用go语言的信号通知系统,用这个通道来接收“中断”和“终止”两个信号

随后从通道里读取信号,在读取到信号之后把信号打印处理

中断(syscall.SIGINT)是手动关闭程序:ctrl+c终止(syscall.SIGTERM)通常是处理在容器给go程序的关闭信号

还有更多的信号,大家可以参考

syscall.SIGHUP // hangup

syscall.SIGINT // interrupt

syscall.SIGQUIT // quit

syscall.SIGILL // illegal instruction

syscall.SIGTRAP // trace/breakpoint trap

syscall.SIGABRT // aborted

syscall.SIGBUS // bus error

syscall.SIGFPE // floating point exception

syscall.SIGKILL // killed

syscall.SIGSEGV // segmentation fault

syscall.SIGPIPE // broken pipe

syscall.SIGALRM // alarm clock

syscall.SIGTERM // terminated

完成实例

这是一个完整的例子,代码中模拟了独立的任务处理协程,在任务处理协程启动后,这里启动了一个协程来等待信号。后续可以执行一些阻塞代码,比如web服务。如果没有后续的阻塞代码可以把等待信号的协程去掉,直接执行那段代码就可以了。

本文介绍了go语言如何处理优雅退出。例子讲解了一个典型的场景,实际情况可能比这个复杂的多,但是总体思路可以提供给大家参考。如果有更好的方式大家可以指教,欢迎评论一起交流。

标签: #c语言输入数字退出程序是什么意思啊视频 #c语言输入数字退出程序是什么意思啊视频教学