日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

golang中的web服务平滑重启

發(fā)布時(shí)間:2025/6/15 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 golang中的web服务平滑重启 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

新進(jìn)來(lái)的請(qǐng)求怎么辦?

  • fork一個(gè)子進(jìn)程,繼承父進(jìn)程的監(jiān)聽socket
  • 子進(jìn)程啟動(dòng)成功之后,接收新的連接
  • 父進(jìn)程停止接收新的連接,等已有的請(qǐng)求處理完畢,退出
  • 優(yōu)雅重啟成功

平滑升級(jí)

子進(jìn)程如何繼承父進(jìn)程的文件句柄?

  • 通過(guò)os.Cmd對(duì)象中的ExtraFiles參數(shù)進(jìn)行傳遞

子進(jìn)程如何繼承父進(jìn)程的文件句柄

  • 通過(guò)os.Cmd對(duì)象中的ExtraFiles參數(shù)進(jìn)行傳遞
  • 文件句柄繼承實(shí)例分析

web服務(wù)器平滑升級(jí)

  • 使用go1.8版本的shutdown方法進(jìn)行優(yōu)雅關(guān)閉
  • 使用socket繼承實(shí)現(xiàn),子進(jìn)程接管父進(jìn)程的監(jiān)聽socket

文件句柄繼承實(shí)例分析

package mainimport ("flag""fmt""os""os/exec""time" )var (child *bool )func init() {child = flag.Bool("child", false, "繼承于父進(jìn)程(internal use only)")flag.Parse() }func readFromParent() {//fd = 0,標(biāo)準(zhǔn)輸出//fd = 1,標(biāo)準(zhǔn)輸入//fd = 2,標(biāo)準(zhǔn)錯(cuò)誤輸出//fd = 3, ==> ExtraFiles[0]//fd = 4, ==> ExtraFiles[1]//第一個(gè)參數(shù)文件句柄的下標(biāo),就是ExtraFiles[0], 第二個(gè)參數(shù)名字可以隨便取f := os.NewFile(3, "")count := 0for {//格式化字符串str := fmt.Sprintf("hello, i'child process, write: %d line \n", count)count++//寫入到這個(gè)文件_, err := f.WriteString(str)if err != nil {fmt.Printf("write string failed, err: %v\n", err)time.Sleep(time.Second)continue}//每一秒寫下文件time.Sleep(time.Second)} }//啟動(dòng)子進(jìn)程 func startChild(file *os.File) {args := []string{"-child"}//os.Args[0]是文件路徑,帶上-child選項(xiàng)cmd := exec.Command(os.Args[0], args...)cmd.Stdout = os.Stdoutcmd.Stderr = os.Stderr//放socket fd在第一個(gè)entry,只要把父進(jìn)程傳遞過(guò)來(lái)的放在這里cmd.ExtraFiles = []*os.File{file}//到main函數(shù)err := cmd.Start()if err != nil {fmt.Printf("start child failed, err: %v\n", err.Error())return} }func main() {//表示已經(jīng)是一個(gè)子進(jìn)程了if child != nil && *child == true {fmt.Printf("繼承于父進(jìn)程的文件句柄\n")//子進(jìn)程readFromParent()return}//父進(jìn)程的邏輯,打開文件句柄file, err := os.OpenFile("./test.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0755)if err != nil {fmt.Printf("open file failed, err:%v\n", err)return}//啟動(dòng)一個(gè)子進(jìn)程,把文件句柄給子進(jìn)程startChild(file)fmt.Println("父進(jìn)程退出") }

總結(jié)

以上是生活随笔為你收集整理的golang中的web服务平滑重启的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。