校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > golang 監(jiān)聽服務的信號,實現(xiàn)平滑啟動,linux信號說明詳解

golang 監(jiān)聽服務的信號,實現(xiàn)平滑啟動,linux信號說明詳解

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

監(jiān)聽服務的信號,實現(xiàn)平滑啟動,linux信號說明

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("服務啟動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 信號
		signal.Notify(exit, syscall.SIGINT, syscall.SIGTERM)
		select {
		case -exit:
			fmt.Println("進程已被取消~")
			return s.Shutdown(ctx)
		}
	})
	err := g.Wait()
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println("服務啟動成功!")
	if ctx.Err() !=nil {
		fmt.Println(ctx.Err())
		fmt.Println("服務關閉成功!")
		os.Exit(0)
	}
 
}

補充:golang http服務實現(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() 這個位置hang住整個進程的
// 可以把這個程序看成兩部分,1個是web服務的監(jiān)聽部分,一個是處理部分, 如果web服務器不開啟了,那么就不能處理新進來的請求了(可以理解為一個帶路的)
// 真正讓這個請求斷掉  是因為主進程(main)被kill
// 所以平滑重啟的原理就是,先kill掉web服務器,不讓新的請求進來,等現(xià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("目前還有進行中的請求,請稍等")
            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()//請求寫日志
    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
}

主要思路:

對于每個請求都做記錄,處理完成之后做刪除。 用一個協(xié)程去監(jiān)控中斷信號,有中斷信號先把http服務關閉。

如果這個時候還有請求沒有處理完,那么就輪訓等待,等全部處理完那么就 發(fā)出終止信號結束main進程的執(zhí)行

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

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

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

巨人網絡通訊聲明:本文標題《golang 監(jiān)聽服務的信號,實現(xiàn)平滑啟動,linux信號說明詳解》,本文關鍵詞  golang,監(jiān)聽,服務,的,信號,;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《golang 監(jiān)聽服務的信號,實現(xiàn)平滑啟動,linux信號說明詳解》相關的同類信息!
  • 本頁收集關于golang 監(jiān)聽服務的信號,實現(xiàn)平滑啟動,linux信號說明詳解的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    九色|91porny| 中文字幕一区二区不卡| 亚洲高清视频在线| 717成人午夜免费福利电影| 无码av免费一区二区三区试看| 欧美妇女性影城| 国产一二精品视频| 亚洲另类中文字| 日韩免费成人网| 99九九99九九九视频精品| 亚洲激情在线播放| 亚洲美女一区二区三区| 久久久国产一区二区三区四区小说 | 欧美大片一区二区三区| 日韩一区二区精品在线观看| 色婷婷综合激情| 美女mm1313爽爽久久久蜜臀| 国产精品美女久久久久久久久久久| 欧美三级中文字幕在线观看| 久久电影网站中文字幕| 亚洲综合小说图片| 日韩一区中文字幕| 一区二区三区视频在线观看| 久久精品一区四区| 91精品免费观看| 久久久精品tv| 亚洲国产日产av| 国产精品一区二区三区网站| 国内精品嫩模私拍在线| 天堂一区二区在线免费观看| 最新高清无码专区| 国产欧美1区2区3区| 久久人人97超碰com| 国产精品无遮挡| 日本中文字幕一区二区有限公司| 日精品一区二区三区| 精品制服美女丁香| 欧美午夜精品电影| 欧美撒尿777hd撒尿| 久久久久久久久久久久久夜| 一区二区三区中文字幕精品精品| 老司机精品视频在线| www.综合网.com| 成人av免费在线观看| 国产不卡一区视频| 国产精品香蕉一区二区三区| 一道本成人在线| 国产色综合一区| 麻豆91免费看| 欧美日韩国产123区| 91精品国产色综合久久ai换脸 | 精品系列免费在线观看| 99精品视频一区二区| 26uuu国产日韩综合| 欧美成人一区二区三区片免费| 日韩视频一区在线观看| 亚洲欧美日韩国产综合| 大桥未久av一区二区三区中文| 成人高清免费观看| 欧美精品一区二区三区在线| 国产偷v国产偷v亚洲高清| 婷婷国产在线综合| 欧美日韩久久久一区| 亚洲精选视频在线| 色偷偷久久人人79超碰人人澡 | 欧美三级资源在线| 亚洲人妖av一区二区| 国产在线精品一区二区三区不卡 | 手机精品视频在线观看| 91蝌蚪porny成人天涯| 欧美日韩中文精品| 亚洲国产一区二区在线播放| 欧美性生活影院| 亚洲aaa精品| 国产成人福利片| 欧美日韩国产首页在线观看| 国产精品福利一区| 日韩黄色免费网站| 538prom精品视频线放| 免费在线观看一区二区三区| 不卡av免费在线观看| 国产精品久久看| 欧洲av在线精品| 亚洲国产高清aⅴ视频| 亚洲一区二区黄色| 欧美日韩在线播放| 奇米四色…亚洲| 国产日韩影视精品| heyzo一本久久综合| 亚洲综合在线电影| 6080午夜不卡| 成人午夜精品一区二区三区| 1000精品久久久久久久久| 91成人国产精品| 久久精品欧美一区二区三区不卡 | 国产欧美日韩一区二区三区在线观看| 国产成人8x视频一区二区| 国产精品久久久久久久久免费桃花 | 国产成人免费网站| 中文字幕一区二区在线观看| 色狠狠综合天天综合综合| 视频一区国产视频| 久久久91精品国产一区二区精品| 99re热这里只有精品免费视频| 洋洋av久久久久久久一区| 日韩精品资源二区在线| 成人国产精品免费观看视频| 香蕉久久夜色精品国产使用方法| www久久久久| 欧美性感一区二区三区| 久久99精品网久久| 亚洲午夜在线观看视频在线| 久久亚洲二区三区| 欧美精品在欧美一区二区少妇| 国产精品99久久久久久久女警 | 精品国产露脸精彩对白| 99视频一区二区三区| 天天av天天翘天天综合网色鬼国产| 国产清纯白嫩初高生在线观看91| 欧美视频你懂的| 成人成人成人在线视频| 喷白浆一区二区| 亚洲精品国产精华液| 国产日韩欧美高清在线| 在线综合+亚洲+欧美中文字幕| 成人精品在线视频观看| 狂野欧美性猛交blacked| 亚洲va韩国va欧美va精品| 最新欧美精品一区二区三区| 久久女同精品一区二区| 日韩午夜小视频| 欧美一区二区在线免费播放| 91极品美女在线| 色欧美88888久久久久久影院| 国产一区二区三区不卡在线观看| 视频一区在线视频| 一区二区三区四区不卡视频| 欧美国产精品v| 亚洲国产成人一区二区三区| 久久久影视传媒| 国产亚洲精品免费| 久久精品在线免费观看| 久久综合久久鬼色中文字| 日韩免费看的电影| 日韩一级大片在线观看| 欧美精品123区| 欧美一区二区三区视频在线| 69久久99精品久久久久婷婷| 欧美日韩第一区日日骚| 欧美中文字幕一区| 欧美色涩在线第一页| 欧美日韩免费视频| 欧美日韩国产大片| 欧美一区二区三区日韩视频| 欧美大片日本大片免费观看| 久久综合九色综合97婷婷| 精品久久久久香蕉网| 国产亚洲成av人在线观看导航| 国产午夜精品一区二区| 国产精品视频麻豆| 亚洲美女屁股眼交| 亚洲电影第三页| 久久91精品国产91久久小草| 精品一区二区免费视频| 国产精品一区免费在线观看| 成人国产精品免费| 欧美亚洲一区二区在线| 欧美一区二区不卡视频| 26uuu国产电影一区二区| 国产精品久久久久一区 | 国产精品每日更新在线播放网址| 中文字幕日本不卡| 亚洲第一主播视频| 国产精品影视网| 一本大道av伊人久久综合| 在线播放国产精品二区一二区四区| 日韩女优制服丝袜电影| 欧美激情一区在线观看| 亚洲自拍都市欧美小说| 国产真实乱偷精品视频免| 99久久久国产精品免费蜜臀| 欧美日韩一级黄| 欧美国产日韩亚洲一区| 亚洲一区二区三区四区在线| 久久不见久久见免费视频7| 不卡一卡二卡三乱码免费网站| 欧美日韩视频在线一区二区 | 欧洲精品中文字幕| 精品动漫一区二区三区在线观看| 1区2区3区欧美| 免费欧美日韩国产三级电影| 成人av先锋影音| 日韩一区二区视频| 国产精品美女久久久久久久 | 99久久99久久精品免费观看 | 日韩欧美美女一区二区三区| 中文字幕中文字幕中文字幕亚洲无线| 日韩av电影一区| 99久久精品国产精品久久| 日韩精品一区二区三区蜜臀|