golang中的web服务平滑重启
生活随笔
收集整理的這篇文章主要介紹了
golang中的web服务平滑重启
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
新進(jìn)來的請(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)程的文件句柄?
- 通過os.Cmd對(duì)象中的ExtraFiles參數(shù)進(jìn)行傳遞
子進(jìn)程如何繼承父進(jìn)程的文件句柄
- 通過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)程傳遞過來的放在這里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服务平滑重启的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: golang中的优雅中止
- 下一篇: golang中的goredis