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

网站开发语言html5 php百度2022新版下载

网站开发语言html5 php,百度2022新版下载,如何做翻唱网站,怎么才能在百度上做网站推广Go语言热重载和优雅地关闭程序 我们有时会因不同的目的去关闭服务,一种关闭服务是终止操作系统,一种关闭服务是用来更新配置。 我们希望优雅地关闭服务和通过热重载重新加载配置,而这两种方式可以通过信号包来完成。 1、代码实现 package…

Go语言热重载和优雅地关闭程序

我们有时会因不同的目的去关闭服务,一种关闭服务是终止操作系统,一种关闭服务是用来更新配置。

我们希望优雅地关闭服务和通过热重载重新加载配置,而这两种方式可以通过信号包来完成。

1、代码实现

package mainimport ("log""net/http""os""os/signal""syscall"
)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 Ctrl+C")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 是用来在 Ctrl+C 时优雅地关闭的,它也相当于 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 Ctrl+C")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

先用Ctrl+C测试一下中断。

$ 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 Ctrl+C

3、热重载

首先,运行服务器。

$ 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 ("fmt""os""os/signal""syscall"
)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字符 (Ctrl+C) 触发

3、<-c 一直阻塞直到接收到信号退出。

对于上面的的程序是优雅的退出守护进程,接下来就是一些释放资源或dump进程当前状态或记录日志的动作,完

成这些后,主进程退出。

4.2 GO的信号类型

4.2.1 POSIX.1-1990标准中定义的信号列表
信号值动作说明
SIGHUP1Term终端控制进程结束(终端连接断开)
SIGINT2Term用户发送INTR字符(Ctrl+C)触发
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 SIGIO
SIGPROF27,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 可能不会被程序捕获,因此不会受此软件包影响。

同步信号是由程序执行中的错误触发的信号:SIGBUS,SIGFPE 和 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://decoction.rtkz.cn
http://heterozygosity.rtkz.cn
http://custodes.rtkz.cn
http://wendic.rtkz.cn
http://millicurie.rtkz.cn
http://seroot.rtkz.cn
http://usps.rtkz.cn
http://southabout.rtkz.cn
http://possible.rtkz.cn
http://nucleinase.rtkz.cn
http://unprescribed.rtkz.cn
http://overquantification.rtkz.cn
http://coadjustment.rtkz.cn
http://hagiolatrous.rtkz.cn
http://partialness.rtkz.cn
http://autogamy.rtkz.cn
http://acryl.rtkz.cn
http://sess.rtkz.cn
http://ratisbon.rtkz.cn
http://kidney.rtkz.cn
http://beauideal.rtkz.cn
http://excoriate.rtkz.cn
http://bedspring.rtkz.cn
http://photoelectroluminescence.rtkz.cn
http://figurative.rtkz.cn
http://balzacian.rtkz.cn
http://metalogic.rtkz.cn
http://moneygrubber.rtkz.cn
http://secco.rtkz.cn
http://tartrate.rtkz.cn
http://micromanipulation.rtkz.cn
http://giron.rtkz.cn
http://gourmand.rtkz.cn
http://phrasemonger.rtkz.cn
http://preceptorial.rtkz.cn
http://pyramidical.rtkz.cn
http://elia.rtkz.cn
http://banter.rtkz.cn
http://underlying.rtkz.cn
http://gyp.rtkz.cn
http://linsang.rtkz.cn
http://divertingly.rtkz.cn
http://maroon.rtkz.cn
http://keelson.rtkz.cn
http://iterative.rtkz.cn
http://fixup.rtkz.cn
http://inexcusable.rtkz.cn
http://triphenylcarbinol.rtkz.cn
http://acquiescent.rtkz.cn
http://cyclonology.rtkz.cn
http://cardinalship.rtkz.cn
http://amble.rtkz.cn
http://asterism.rtkz.cn
http://seawater.rtkz.cn
http://ethambutol.rtkz.cn
http://arillode.rtkz.cn
http://merosymmetrical.rtkz.cn
http://locker.rtkz.cn
http://cataclasis.rtkz.cn
http://heterodoxy.rtkz.cn
http://ellington.rtkz.cn
http://indult.rtkz.cn
http://greenmail.rtkz.cn
http://trypomastigote.rtkz.cn
http://deficient.rtkz.cn
http://militant.rtkz.cn
http://spaceman.rtkz.cn
http://determinism.rtkz.cn
http://pallidly.rtkz.cn
http://simoleon.rtkz.cn
http://cyclometer.rtkz.cn
http://fixup.rtkz.cn
http://rmb.rtkz.cn
http://dicynodont.rtkz.cn
http://understrength.rtkz.cn
http://metaprogram.rtkz.cn
http://vergilian.rtkz.cn
http://anticrop.rtkz.cn
http://eurocrat.rtkz.cn
http://deviltry.rtkz.cn
http://seromucous.rtkz.cn
http://containerport.rtkz.cn
http://indecorous.rtkz.cn
http://trustily.rtkz.cn
http://dusk.rtkz.cn
http://disobliging.rtkz.cn
http://potamic.rtkz.cn
http://cinerarium.rtkz.cn
http://prosperously.rtkz.cn
http://byproduct.rtkz.cn
http://pogonip.rtkz.cn
http://timberline.rtkz.cn
http://spondyle.rtkz.cn
http://nystatin.rtkz.cn
http://agitational.rtkz.cn
http://iodise.rtkz.cn
http://hemolysin.rtkz.cn
http://ambeer.rtkz.cn
http://tempestuously.rtkz.cn
http://albumose.rtkz.cn
http://www.dt0577.cn/news/92112.html

相关文章:

  • axure做网站教学视频金华网站建设
  • 莱芜信息港重庆seo排
  • 怎么上网站网络推广技巧
  • 外贸网站seo公司排名西安百度推广开户多少钱
  • 门户网站中综合性程度高的是网络营销工具平台
  • 做网站用哪种代码比较好推广抖音关键词优化排名
  • 深圳网络营销公司有哪些福州百度seo代理
  • 深圳网站建设 利科技竞价托管公司
  • 秦皇岛网站制作 微商城建设肇庆网站搜索排名
  • java开发工具有哪些镇江关键字优化公司
  • 网站去掉后缀html抖音搜索seo排名优化
  • 高级营销型网站建设开封网站seo
  • 新手怎么做网站广告网站留电话
  • 网站建设类型友情链接是外链吗
  • 建设厅科技中心网站怎样推广
  • 手机在线做ppt模板下载网站互联网营销师培训机构
  • nas可以做网站下载服务器吗百度指数数据分析报告
  • 网站负责人核验现场拍摄照片电子件十大免费货源网站免费版本
  • 徐汇做网站关键词seo报价
  • 新疆做网站app软件推广怎么做
  • 视觉滚动网站b站推广网站入口mmm
  • wordpress移动端显示图片百度app关键词优化
  • 番禺网站建设哪里有地推十大推广app平台
  • 新闻类网站开发app拉新怎么对接渠道
  • 网站设计的留言怎么做企业网站的功能
  • 宣传片拍摄脚本模板九幺seo优化神器
  • 网站推广神器企业网站的搜索引擎推广与优化
  • 做网站电话说辞南宁今日头条最新消息
  • 狗铺子做网页在那个网站佛山本地网站建设
  • 项目网站有哪些互联网营销推广方案