前言:
此时兄弟们对“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语言如何处理优雅退出。例子讲解了一个典型的场景,实际情况可能比这个复杂的多,但是总体思路可以提供给大家参考。如果有更好的方式大家可以指教,欢迎评论一起交流。