当前位置: 首页 > news >正文

海丰县网站设计济南网站制作费用

海丰县网站设计,济南网站制作费用,thinkphp大型网站开发,女装网站建设规划书Go语言热重载和优雅地关闭程序 我们有时会因不同的目的去关闭服务#xff0c;一种关闭服务是终止操作系统#xff0c;一种关闭服务是用来更新配置。 我们希望优雅地关闭服务和通过热重载重新加载配置#xff0c;而这两种方式可以通过信号包来完成。 1、代码实现 package…Go语言热重载和优雅地关闭程序 我们有时会因不同的目的去关闭服务一种关闭服务是终止操作系统一种关闭服务是用来更新配置。 我们希望优雅地关闭服务和通过热重载重新加载配置而这两种方式可以通过信号包来完成。 1、代码实现 package mainimport (lognet/httposos/signalsyscall )type Config struct {Message string }var conf Config{Message: Before hot reload}func router() {log.Println(starting up....)http.HandleFunc(/, func(w http.ResponseWriter, r *http.Request) {_, _ w.Write([]byte(conf.Message))})go func() {log.Fatal(http.ListenAndServe(:8080, nil))}() }func main() {router()sigCh : make(chan os.Signal, 1)signal.Notify(sigCh, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM)for {multiSignalHandler(-sigCh)} }func multiSignalHandler(signal os.Signal) {switch signal {case syscall.SIGHUP:log.Println(Signal:, signal.String())log.Println(After hot reload)conf.Message Hot reload has been finished.case syscall.SIGINT:log.Println(Signal:, signal.String())log.Println(Interrupt by CtrlC)os.Exit(0)case syscall.SIGTERM:log.Println(Signal:, signal.String())log.Println(Process is killed.)os.Exit(0)default:log.Println(Unhandled/unknown signal)} }首先定义了一个 Config 结构并声明了一个 conf 变量。 type Config struct {Message string }var conf Config{Message: Before hot reload}这里的代码只是一个简单的配置样本你可以根据自己的需要定义一个复杂的结构。 其次定义一个路由器函数用来绑定和监听 8080 端口。在热重载配置完成后它也被用来显示结果。 func router() {log.Println(starting up....)http.HandleFunc(/, func(w http.ResponseWriter, r *http.Request) {_, _ w.Write([]byte(conf.Message))})go func() {log.Fatal(http.ListenAndServe(:8080, nil))}() }下一步是服务器关机和热重载配置当一个服务器关闭时它应该停止接收新的请求同时完成正在进行的请求 返回其响应然后关闭在这里使用信号包实现。 sigCh : make(chan os.Signal, 1)之后使用 signal.Notify() 一起发送更多的信号。 signal.Notify(sigCh, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM)当程序被中断时signal.Notify 将向 sigCh 通道发送一个信号。 syscall.SIGHUP、syscall.SIGINT 和 syscall.SIGTERM 是什么意思? syscall.SIGINT 是用来在 CtrlC 时优雅地关闭的它也相当于 os.Interrupt。syscall.SIGTERM 是常用的终止信号也是 docker 容器的默认信号Kubernetes 也使用它。syscall.SIGHUP 用于热重载配置。 如何优雅地关闭multiSignalHandler(-sigCh) 被用来接收 chan 值然后它将决定运行代码的哪一部分。 func multiSignalHandler(signal os.Signal) {switch signal {case syscall.SIGHUP:log.Println(Signal:, signal.String())log.Println(After hot reload)conf.Message Hot reload has been finished.case syscall.SIGINT:log.Println(Signal:, signal.String())log.Println(Interrupt by CtrlC)os.Exit(0)case syscall.SIGTERM:log.Println(Signal:, signal.String())log.Println(Process is killed.)os.Exit(0)default:log.Println(Unhandled/unknown signal)} }2、测试优雅关闭 首先运行服务器。 $ go run main.go 2023/06/25 09:57:05 starting up....发送一个curl请求。 $ curl localhost:8080 Before hot reload先用CtrlC测试一下中断。 $ go run main.go 2023/06/25 09:57:05 starting up.... 2023/06/25 09:59:45 Signal: interrupt 2023/06/25 09:59:45 Interrupt by CtrlC3、热重载 首先运行服务器。 $ go run main.go 2023/06/24 22:03:17 starting up....然后发送curl请求。 $ curl localhost:8080 Before hot reload查看进程 $ lsof -i tcp:8080 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME main 85193 root 3u IPv6 13642377 0t0 TCP *:webcache (LISTEN)使用 kill 杀死进程 $ kill -SIGHUP 85193$ go run main.go 2023/06/24 22:03:17 starting up.... 2023/06/24 22:06:05 Signal: hangup 2023/06/24 22:06:05 After hot reload如果直接使用 kill 命令杀死程序 $ go run main.go 2023/06/24 22:14:11 starting up....$ lsof -i tcp:8080 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME main 89619 root 3u IPv6 13669401 0t0 TCP *:webcache (LISTEN)$ kill -9 89619$ go run main.go 2023/06/24 22:14:11 starting up.... 2023/06/24 22:14:50 Signal: terminated 2023/06/24 22:14:50 Process is killed.4、Go信号库os/signal 在官方介绍中这个库主要封装信号实现对输入信号的访问信号主要用于类 Unix 系统。 信号是事件发生时对进程的通知机制有时也称之为软件中断。信号与硬件中断的相似之处在于打断了程序执行的 正常流程大多数情况下无法预测信号到达的精确时间。 因为一个具有合适权限的进程可以向另一个进程发送信号这可以称为进程间的一种同步技术。当然进程也可以 向自身发送信号。然而发往进程的诸多信号通常都是源于内核。引发内核为进程产生信号的各类事件如下 硬件发生异常即硬件检测到一个错误条件并通知内核随即再由内核发送相应信号给相关进程。比如执行一 条异常的机器语言指令(除0引用无法访问的内存区域)。 用户键入了能够产生信号的终端特殊字符。如中断字符 (通常是 Control-C)、暂停字符(通常是 Control-Z)。 发生了软件事件。如调整了终端窗口大小定时器到期等。 4.1 举例说明 package mainimport (fmtosos/signalsyscall )func main() {// os.Signal是一个系统信号接收channelc : make(chan os.Signal, 1)// syscall都是一些系统信号signal.Notify(c, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT)for {s : -cfmt.Printf(get a signal %s, s.String())switch s {case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT:fmt.Printf(exit)os.Exit(0)case syscall.SIGHUP:fmt.Printf(reload)default:fmt.Printf(nothing)}} }1、首先初始化一个 os.Signal 类型的 channel我们必须使用缓冲通道否则在信号发送时如果还没有准备好接 收信号就有丢失信号的风险。 2、signal.notify 用于监听信号参数1表示接收信号的 channel参数2及后面的表示要监听的信号 syscall.SIGHUP 表示终端控制进程结束 syscall.SIGQUIT 表示用户发送QUIT字符 (Ctrl/) 触发 syscall.SIGTERM 表示结束进程 syscall.SIGINT 表示用户发送INTR字符 (CtrlC) 触发 3、-c 一直阻塞直到接收到信号退出。 对于上面的的程序是优雅的退出守护进程接下来就是一些释放资源或dump进程当前状态或记录日志的动作完 成这些后主进程退出。 4.2 GO的信号类型 4.2.1 POSIX.1-1990标准中定义的信号列表 信号值值动作说明SIGHUP1Term终端控制进程结束(终端连接断开)SIGINT2Term用户发送INTR字符(CtrlC)触发SIGQUIT3Core用户发送QUIT字符(Ctrl/)触发SIGILL4Core非法指令(程序错误、试图执行数据段、栈溢出等)SIGABRT6Core调用abort函数触发SIGFPE8Core算术运行错误(浮点运算错误、除数为零等)SIGKILL9Term无条件结束程序(不能被捕获、阻塞或忽略)SIGSEGV11Core无效内存引用(试图访问不属于自己的内存空间、对只读内存空间进行写操作)SIGPIPE13Term消息管道损坏(FIFO/Socket通信时管道未打开而进行写操作)SIGALRM14Term时钟定时信号SIGTERM15Term结束程序(可以被捕获、阻塞或忽略)SIGUSR130,10,16Term用户保留SIGUSR231,12,17Term用户保留SIGCHLD20,17,18Ign子进程结束(由父进程接收)SIGCONT19,18,25Cont继续执行已经停止的进程(不能被阻塞)SIGSTOP17,19,23Stop停止进程(不能被捕获、阻塞或忽略)SIGTSTP18,20,24Stop停止进程(可以被捕获、阻塞或忽略)SIGTTIN21,21,26Stop后台程序从终端中读取数据时触发SIGTTOU22,22,27Stop后台程序向终端中写数据时触发 4.2.2 在SUSv2和POSIX.1-2001标准中的信号列表 信号值动作说明SIGTRAP5CoreTrap指令触发(如断点在调试器中使用)SIGBUS0,7,10Core非法地址(内存地址对齐错误)SIGPOLLTermPollable event (Sys V). Synonym for SIGIOSIGPROF27,27,29Term性能时钟信号(包含系统调用时间和进程占用CPU的时间)SIGSYS12,31,12Core无效的系统调用(SVr4)SIGURG16,23,21Ign有紧急数据到达Socket(4.2BSD)SIGVTALRM26,26,28Term虚拟时钟信号(进程占用CPU的时间)(4.2BSD)SIGXCPU24,24,30Core超过CPU时间资源限制(4.2BSD)SIGXFSZ25,25,31Core超过文件大小资源限制(4.2BSD) 信号 SIGKILL 和 SIGSTOP 可能不会被程序捕获因此不会受此软件包影响。 同步信号是由程序执行中的错误触发的信号SIGBUSSIGFPE 和 SIGSEGV。这些只在程序执行时才被认为是同 步的而不是在使用 os.Process.Kill 或 kill 程序或类似的机制发送时。一般来说除了如下所述Go 程序会将同 步信号转换为运行时异常。其余信号是异步信号它们不是由程序错误触发的而是从内核或其他程序发送的。 在异步信号中SIGHUP 信号在程序失去其控制终端时发送。当控制终端的用户按下中断字符(默认为^ C (Control-C))时发送 SIGINT 信号。当控制终端的用户按下退出字符时发送 SIGQUIT 信号默认为^ \ (Control-Backslash)。一般情况下您可以通过按^ C来使程序简单地退出并且可以通过按^使堆栈转储退出。 4.3 Kill命令的原理 我们平时在 Linux 系统会 kill 命令来杀死进程那其中的原理是什么呢。 4.3.1 kill pid kill pid 的作用是向进程号为 pid 的进程发送 SIGTERM (这是 kill 默认发送的信号)该信号是一个结束进程的信号 且可以被应用程序捕获。若应用程序没有捕获并响应该信号的逻辑代码则该信号的默认动作是 kill 掉进程。这是 终止指定进程的推荐做法。 4.3.2 kill -9 pid kill -9 pid 则是向进程号为 pid 的进程发送 SIGKILL (该信号的编号为9)从本文上面的说明可知SIGKILL 既不能 被应用程序捕获也不能被阻塞或忽略其动作是立即结束指定进程。通俗地说应用程序根本无法感知 SIGKILL 信号它在完全无准备的情况下就被收到 SIGKILL 信号的操作系统给干掉了显然在这种暴力情况下应用 程序完全没有释放当前占用资源的机会。事实上SIGKILL 信号是直接发给 init 进程的它收到该信号后负责终 止 pid 指定的进程。在某些情况下(如进程已经 hang 死无响应正常信号)就可以使用 kill -9 来结束进程。
http://www.zqtcl.cn/news/978720/

相关文章:

  • 本网站维护升级官方网站建设滞后
  • 网站上漂亮的甘特图是怎么做的江门seo方法
  • 局域网建设网站seo优化查询
  • 网站安装模板wordpress多个函数文件
  • 网站建设飠金手指排名十二毕业设计论文网
  • 高密哪里做网站好网络营销的四大特点
  • 网站锚文本怎么做怎么在网上接网站建设
  • php做公司网站中国大工程建设需要什么样的人才
  • 优化公司怎么优化网站的技能网站建设项目需求
  • wordpress怎么修改主页网站改版seo
  • 做视频网站需要多少带宽lnmp wordpress 数据库
  • 网站速度慢wordpress徐州网络推广公司
  • 网站建设增城seo外链是什么意思
  • php做企业网站管理系统免费网站制作手机软件的app
  • 商城网站建设咨询如何通过网站后台修改网站
  • 重庆网站建设论文2 如何写一份详细的网站开发方案
  • 宁波门户网站建设做购物网站表结构分析
  • 上传网站图片处理画册设计多少钱一页
  • 网站做标签页新公司网站建设都有哪些优势
  • 上门做指甲哪个网站百度搜索榜
  • 西安网站seo优化商城域名注册管理机构
  • 凡客网站目录优化服装网站建设论文
  • 自助网站搭建哈尔滨seo优化
  • 做网站和软件的团队网页设计与网页制作的实验报告
  • 广州网站建设很棒 乐云践新wordpress搬家 登录报错
  • 顺的网站建设案例如何上传网站
  • 网站管理和建设工作职责中国建设银行卖狗年纪念币官方网站
  • 如何快速开发一个网站干洗店投资多少钱可以营业了
  • 哪些分类网站WordPress商用收费吗
  • 南开网站建设优化seo福建凭祥建设工程有限公司网站