婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識(shí)庫(kù) > golang 監(jiān)聽服務(wù)的信號(hào),實(shí)現(xiàn)平滑啟動(dòng),linux信號(hào)說明詳解

golang 監(jiān)聽服務(wù)的信號(hào),實(shí)現(xiàn)平滑啟動(dòng),linux信號(hào)說明詳解

熱門標(biāo)簽:評(píng)價(jià)高的400電話辦理 百度地圖標(biāo)注后傳給手機(jī) 外呼系統(tǒng)顯本地手機(jī)號(hào) 涿州代理外呼系統(tǒng) excel地圖標(biāo)注分布數(shù)據(jù) 壽光微信地圖標(biāo)注 外呼系統(tǒng)用什么卡 電話機(jī)器人軟件免費(fèi) 阿克蘇地圖標(biāo)注

監(jiān)聽服務(wù)的信號(hào),實(shí)現(xiàn)平滑啟動(dòng),linux信號(hào)說明

package main 
import (
	"context"
	"fmt"
	"golang.org/x/sync/errgroup"
	"net/http"
	"os"
	"os/signal"
	"syscall"
) 
 
func main() { 
	g, ctx := errgroup.WithContext(context.Background())
	fmt.Println("服務(wù)啟動(dòng)start!")
	addr := ":9091"
	s :=http.Server{
		Addr: addr,
		Handler:http.DefaultServeMux,
	}
	g.Go(func() error {
		http.HandleFunc("/test1", func(writer http.ResponseWriter, request *http.Request) {
			fmt.Println("tes1")
			writer.Write([]byte("tes1"))
		})
		return s.ListenAndServe()
	})
	g.Go(func() error {
		exit := make(chan os.Signal)
		//監(jiān)聽 Ctrl+C 信號(hào)
		signal.Notify(exit, syscall.SIGINT, syscall.SIGTERM)
		select {
		case -exit:
			fmt.Println("進(jìn)程已被取消~")
			return s.Shutdown(ctx)
		}
	})
	err := g.Wait()
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println("服務(wù)啟動(dòng)成功!")
	if ctx.Err() !=nil {
		fmt.Println(ctx.Err())
		fmt.Println("服務(wù)關(guān)閉成功!")
		os.Exit(0)
	}
 
}

補(bǔ)充:golang http服務(wù)實(shí)現(xiàn)平滑重啟

看代碼吧~

package main 
import (
    "context"
    "encoding/json"
    "fmt"
    "math/rand"
    "net/http"
    "os"
    "os/signal"
    "time"
)
 
var logChan  = make(chan map[string]interface{}) 
var requestStatusMap = map[int]bool{}  
var done = make(chan bool, 1)
var quit = make(chan os.Signal, 1) 
 
//為什么這樣可以平滑重啟?
// 正常情況下是server.ListenAndServe() 這個(gè)位置hang住整個(gè)進(jìn)程的
// 可以把這個(gè)程序看成兩部分,1個(gè)是web服務(wù)的監(jiān)聽部分,一個(gè)是處理部分, 如果web服務(wù)器不開啟了,那么就不能處理新進(jìn)來的請(qǐng)求了(可以理解為一個(gè)帶路的)
// 真正讓這個(gè)請(qǐng)求斷掉  是因?yàn)橹鬟M(jìn)程(main)被kill
// 所以平滑重啟的原理就是,先kill掉web服務(wù)器,不讓新的請(qǐng)求進(jìn)來,等現(xiàn)有的全部請(qǐng)求完了,然后結(jié)束當(dāng)前進(jìn)程
func main() {
    server := newServer()
    signal.Notify(quit, os.Interrupt)
    go monitorKill(server, quit)
    server.ListenAndServe()
    -done
} 
 
func newServer() *http.Server {
    router := http.NewServeMux()
    router.HandleFunc("/hello", sayHello)
    return http.Server{
        Addr:         ":8262",
        Handler:      router,
    }
}
 
func monitorKill(server *http.Server, quit -chan os.Signal)  {
    -quit
    go shutDown(server)
    for {
        if len(requestStatusMap) != 0 {
            fmt.Println("目前還有進(jìn)行中的請(qǐng)求,請(qǐng)稍等")
            time.Sleep(time.Second * 1)
            continue
        } else {
            close(done)
            break
        }
    }
}
 
func shutDown(server *http.Server) {
    if err := server.Shutdown(context.Background()); err != nil {
        fmt.Println(err)
    }
}
 
func sayHello(w http.ResponseWriter, r *http.Request) {
    go WriteInfo()//請(qǐng)求寫日志
    var uniqueId = GenerateRangeNum(1, 1000)
    requestStatusMap[uniqueId] = false
    url := r.URL.Path
    query  := r.URL.RawQuery
    method := r.Method
    a := map[string] interface{}{
        "url" : url,
        "method" : method,
        "query" : query,
        "response": "hello world!",
    }
    logChan-a
    w.Write([]byte("hello world!"))
    time.Sleep(time.Second * 10)
    delete(requestStatusMap, uniqueId)
}
 
func WriteInfo() {
    info := -logChan
    fileName := "/tmp/weekhomework.log"
    _, err := os.Stat(fileName)
    if err != nil || os.IsNotExist(err) {
        _, _ = os.Create(fileName)
    }
    f,err := os.OpenFile(fileName, os.O_WRONLY, 0644)
    defer f.Close()
    if err !=nil {
        fmt.Println(err.Error())
    } else {
        //追加寫入   為什么O_APPEND 模式無法寫入? todo
        n, _ := f.Seek(0, 2)
        infostr, _ := json.Marshal(info)
        _,err=f.WriteAt([]byte(string(infostr) +"\n"), n)
    }
}
 
func GenerateRangeNum(min int, max int) int {
    if min == max {
        return min
    }
    rand.Seed(time.Now().Unix())
    randNum := rand.Intn(max-min) + min
    return randNum
}

主要思路:

對(duì)于每個(gè)請(qǐng)求都做記錄,處理完成之后做刪除。 用一個(gè)協(xié)程去監(jiān)控中斷信號(hào),有中斷信號(hào)先把http服務(wù)關(guān)閉。

如果這個(gè)時(shí)候還有請(qǐng)求沒有處理完,那么就輪訓(xùn)等待,等全部處理完那么就 發(fā)出終止信號(hào)結(jié)束main進(jìn)程的執(zhí)行

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • Linux進(jìn)程間通信--使用信號(hào)
  • 詳解Linux進(jìn)程間通信——使用信號(hào)量
  • 詳解Linux多線程使用信號(hào)量同步
  • Linux下的信號(hào)詳解及捕捉信號(hào)
  • linux下基于C語言的信號(hào)編程實(shí)例
  • Linux線程同步之信號(hào)C語言實(shí)例
  • linux多線程編程詳解教程(線程通過信號(hào)量實(shí)現(xiàn)通信代碼)
  • Linux下semop等待信號(hào)時(shí)出現(xiàn)Interrupted System Call錯(cuò)誤(EINTR)解決方法
  • 淺談Linux信號(hào)機(jī)制

標(biāo)簽:重慶 梅河口 汕頭 欽州 銅川 雞西 吐魯番 蘭州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《golang 監(jiān)聽服務(wù)的信號(hào),實(shí)現(xiàn)平滑啟動(dòng),linux信號(hào)說明詳解》,本文關(guān)鍵詞  golang,監(jiān)聽,服務(wù),的,信號(hào),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《golang 監(jiān)聽服務(wù)的信號(hào),實(shí)現(xiàn)平滑啟動(dòng),linux信號(hào)說明詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于golang 監(jiān)聽服務(wù)的信號(hào),實(shí)現(xiàn)平滑啟動(dòng),linux信號(hào)說明詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产精品福利一区| 亚洲国产wwwccc36天堂| 欧美性大战久久久| 制服丝袜日韩国产| 日韩一级高清毛片| 日韩一级成人av| 欧美一级欧美三级| 日本一区二区三区免费乱视频| 久久日韩粉嫩一区二区三区| 国产精品久久午夜夜伦鲁鲁| 亚洲图片欧美综合| 蜜桃精品在线观看| av毛片久久久久**hd| 欧美人妇做爰xxxⅹ性高电影| 欧美一区二区三区免费视频| 日韩欧美www| 亚洲亚洲人成综合网络| 国产在线精品一区在线观看麻豆| av亚洲精华国产精华| 在线播放欧美女士性生活| 久久久久久久久免费| 亚洲一区二区三区四区的| 人人狠狠综合久久亚洲| 成人黄色在线看| 精品伦理精品一区| 亚洲一区二区三区视频在线播放| 国产一区二区三区免费| 91麻豆精品国产91久久久久久 | 欧美精品一区二区三区视频| 亚洲精品在线电影| 亚洲电影第三页| 韩国午夜理伦三级不卡影院| 欧洲另类一二三四区| 久久久亚洲午夜电影| 一区二区欧美视频| 久久精品免费观看| 午夜私人影院久久久久| 99精品一区二区| 亚洲精品一线二线三线无人区| 亚洲va韩国va欧美va精品| 91麻豆精品一区二区三区| 久久久一区二区三区| 欧美a级理论片| 欧美日韩国产大片| 亚洲柠檬福利资源导航| 91网上在线视频| 亚洲色图一区二区三区| 风间由美性色一区二区三区| 日韩精品专区在线影院重磅| 日韩成人精品视频| av亚洲精华国产精华| 中文字幕乱码日本亚洲一区二区 | 日韩黄色在线观看| 欧洲另类一二三四区| 亚洲狼人国产精品| 色猫猫国产区一区二在线视频| 精品国产乱码久久久久久1区2区| 亚洲在线视频一区| 色屁屁一区二区| 亚洲欧美欧美一区二区三区| 成人性生交大片免费看中文 | 天堂久久久久va久久久久| 欧美私人免费视频| 一区二区三区免费| 欧美伊人久久大香线蕉综合69| 国产精品久久久久久福利一牛影视| 韩国一区二区三区| 久久久国产精品午夜一区ai换脸| 韩国女主播成人在线观看| 日韩一区二区三免费高清| 五月综合激情婷婷六月色窝| 欧美乱妇一区二区三区不卡视频| 亚洲午夜视频在线| 欧美日韩国产天堂| 五月综合激情婷婷六月色窝| 欧美浪妇xxxx高跟鞋交| 日韩av电影免费观看高清完整版 | 欧美三日本三级三级在线播放| 91成人免费电影| 亚洲一区二区三区激情| 99精品欧美一区| 亚洲一区二区三区四区在线观看 | 欧美国产禁国产网站cc| 国产成人综合亚洲网站| 中文字幕一区二区三区精华液| 99久久精品国产精品久久| 国产精品色哟哟| 日本电影欧美片| 蜜桃视频在线观看一区二区| 国产亲近乱来精品视频| 色婷婷综合中文久久一本| 亚洲444eee在线观看| 欧美丝袜丝交足nylons| 久久99国产乱子伦精品免费| 国产无一区二区| 日本韩国欧美国产| 美女视频黄免费的久久| 国产精品免费看片| 欧美高清视频不卡网| 国产99精品在线观看| 欧美激情资源网| 色狠狠色狠狠综合| 三级欧美韩日大片在线看| 欧美国产国产综合| 色诱视频网站一区| 韩国精品久久久| 一区二区三区日本| 国产日韩影视精品| 欧美疯狂性受xxxxx喷水图片| 国产成人激情av| 喷白浆一区二区| 日韩毛片在线免费观看| 欧美成人艳星乳罩| 日本丶国产丶欧美色综合| 国产成人午夜片在线观看高清观看| 亚洲一区二区三区四区不卡| 日本一二三四高清不卡| 精品剧情在线观看| 欧美三级日本三级少妇99| 国内精品伊人久久久久av影院| 亚洲一区二区在线免费观看视频 | 国产精品视频九色porn| 欧美日本在线播放| 91在线国内视频| 久久91精品久久久久久秒播| 亚洲一区二区高清| 国产精品美女久久久久av爽李琼 | 91热门视频在线观看| 国产一区二区三区免费观看| 免费日韩伦理电影| 亚洲综合免费观看高清完整版| 国产日韩精品一区二区三区在线| 日韩美女主播在线视频一区二区三区| 91在线观看成人| av在线不卡电影| 亚洲色图丝袜美腿| 亚洲精品美腿丝袜| 欧美国产丝袜视频| 国产成人啪午夜精品网站男同| 日韩国产欧美一区二区三区| 一区二区三区中文字幕精品精品| 国产人成亚洲第一网站在线播放 | 天天影视色香欲综合网老头| 亚洲免费在线电影| 综合久久一区二区三区| 亚洲欧洲99久久| 亚洲色图.com| 亚洲欧美综合网| 日韩久久一区二区| 久久久不卡网国产精品二区| 久久精品视频一区二区| 国产香蕉久久精品综合网| 久久久精品欧美丰满| 国产婷婷一区二区| 精品成a人在线观看| www国产成人免费观看视频 深夜成人网| 日韩午夜激情视频| 精品国产乱码久久久久久久 | 精品久久五月天| 欧美性感一类影片在线播放| 欧美群妇大交群中文字幕| 欧美精品乱码久久久久久| 日韩精品一区二区三区在线| 国产午夜精品久久久久久免费视 | 欧美精品日韩精品| 91麻豆精品国产91久久久久| 337p亚洲精品色噜噜噜| 欧美大白屁股肥臀xxxxxx| 久久欧美一区二区| 国产精品三级电影| 亚洲日本在线看| 亚洲综合激情另类小说区| 亚洲精品视频在线观看免费 | www.性欧美| 国产精品亚洲第一区在线暖暖韩国| 国产精品主播直播| 成人动漫视频在线| 欧美精品在线一区二区三区| 精品久久久久久久久久久久久久久久久 | 成人性生交大片免费看视频在线 | 日韩黄色一级片| 国产一区二区免费看| 99久久精品国产精品久久| 欧美日韩一区二区电影| 精品福利一区二区三区| 国产精品久久福利| 丝袜亚洲另类欧美综合| 国产乱淫av一区二区三区| 成人性生交大片| 欧美日韩dvd在线观看| 欧美高清视频不卡网| 国产精品不卡在线| 狠狠色丁香婷综合久久| 91成人网在线| 欧美激情在线一区二区| 日本va欧美va瓶| 国产成人精品网址| 91精品国产综合久久久久久久| 精品国产一区二区亚洲人成毛片| 91精品国产综合久久久久久|