电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

golang 監聽服務的信號,實現平滑啟動,linux信號說明詳解

瀏覽:132日期:2024-04-21 11:57:54
監聽服務的信號,實現平滑啟動,linux信號說明

golang 監聽服務的信號,實現平滑啟動,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)//監聽 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服務實現平滑重啟

看代碼吧~

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服務的監聽部分,一個是處理部分, 如果web服務器不開啟了,那么就不能處理新進來的請求了(可以理解為一個帶路的)// 真正讓這個請求斷掉 是因為主進程(main)被kill// 所以平滑重啟的原理就是,先kill掉web服務器,不讓新的請求進來,等現有的全部請求完了,然后結束當前進程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 模式無法寫入? todon, _ := 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}主要思路:

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

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

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

標簽: Linux系統
主站蜘蛛池模板: HDPE土工膜,复合土工膜,防渗膜价格,土工膜厂家-山东新路通工程材料有限公司 | CTAB,表面活性剂1631溴型(十六烷基三甲基溴化铵)-上海升纬化工原料有限公司 | 缓蚀除垢剂_循环水阻垢剂_反渗透锅炉阻垢剂_有机硫化物-郑州威大水处理材料有限公司 | 超声波反应釜【百科】-以马内利仪器 | LED投光灯-工矿灯-led路灯头-工业灯具 - 山东普瑞斯照明科技有限公司 | 北京四合院出租,北京四合院出售,北京平房买卖 - 顺益兴四合院 | 【铜排折弯机,钢丝折弯成型机,汽车发泡钢丝折弯机,线材折弯机厂家,线材成型机,铁线折弯机】贝朗折弯机厂家_东莞市贝朗自动化设备有限公司 | 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 - 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 | 二手光谱仪维修-德国OBLF光谱仪|进口斯派克光谱仪-热电ARL光谱仪-意大利GNR光谱仪-永晖检测 | 无锡门窗-系统门窗-阳光房-封阳台-断桥铝门窗厂[窗致美] | 10吨无线拉力计-2吨拉力计价格-上海佳宜电子科技有限公司 | 齿轮减速机电机一体机_齿轮减速箱加电机一体化-德国BOSERL蜗轮蜗杆减速机电机生产厂家 | 哈希PC1R1A,哈希CA9300,哈希SC4500-上海鑫嵩实业有限公司 | 龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司_龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司 | 挤奶设备过滤纸,牛奶过滤纸,挤奶机过滤袋-济南蓝贝尔工贸有限公司 | 广州二手电缆线回收,旧电缆回收,广州铜线回收-广东益福电缆线回收公司 | IWIS链条代理-ALPS耦合透镜-硅烷预处理剂-上海顶楚电子有限公司 lcd条形屏-液晶长条屏-户外广告屏-条形智能显示屏-深圳市条形智能电子有限公司 | 东莞市天进机械有限公司-钉箱机-粘箱机-糊箱机-打钉机认准东莞天进机械-厂家直供更放心! | 胶泥瓷砖胶,轻质粉刷石膏,嵌缝石膏厂家,腻子粉批发,永康家德兴,永康市家德兴建材厂 | 泉州陶瓷pc砖_园林景观砖厂家_石英砖地铺石价格 _福建暴风石英砖 | 对辊破碎机-液压双辊式,强力双齿辊,四辊破碎机价格_巩义市金联机械设备生产厂家 | 工业PH计|工业ph酸度计|在线PH计价格-合肥卓尔仪器仪表有限公司 济南画室培训-美术高考培训-山东艺霖艺术培训画室 | 【甲方装饰】合肥工装公司-合肥装修设计公司,专业从事安徽办公室、店面、售楼部、餐饮店、厂房装修设计服务 | 旗杆生产厂家_不锈钢锥形旗杆价格_铝合金电动旗杆-上海锥升金属科技有限公司 | 多物理场仿真软件_电磁仿真软件_EDA多物理场仿真软件 - 裕兴木兰 | 不锈钢酒柜|恒温酒柜|酒柜定制|酒窖定制-上海啸瑞实业有限公司 | ★店家乐|服装销售管理软件|服装店收银系统|内衣店鞋店进销存软件|连锁店管理软件|收银软件手机版|会员管理系统-手机版,云版,App | 筒瓦厂家-仿古瓦-寺庙-古建琉璃瓦-宜兴市古典园林建筑陶瓷厂有限公司 | 不锈钢酒柜|恒温酒柜|酒柜定制|酒窖定制-上海啸瑞实业有限公司 | 苗木价格-苗木批发-沭阳苗木基地-沭阳花木-长之鸿园林苗木场 | 定硫仪,量热仪,工业分析仪,马弗炉,煤炭化验设备厂家,煤质化验仪器,焦炭化验设备鹤壁大德煤质工业分析仪,氟氯测定仪 | 瓶盖扭矩测试仪-瓶盖扭力仪-全自动扭矩仪-济南三泉中石单品站 | 阻垢剂,反渗透阻垢剂,缓蚀阻垢剂-山东普尼奥水处理科技有限公司 真空粉体取样阀,电动楔式闸阀,电动针型阀-耐苛尔(上海)自动化仪表有限公司 | 气动球阀_衬氟蝶阀_调节阀_电动截止阀_上海沃托阀门有限公司 | MOOG伺服阀维修,ATOS比例流量阀维修,伺服阀维修-上海纽顿液压设备有限公司 | 山东石英砂过滤器,除氟过滤器「价格低」-淄博胜达水处理 | 3d可视化建模_三维展示_产品3d互动数字营销_三维动画制作_3D虚拟商城 【商迪3D】三维展示服务商 广东健伦体育发展有限公司-体育工程配套及销售运动器材的体育用品服务商 | 泰安办公家具-泰安派格办公用品有限公司 | 磁力加热搅拌器-多工位|大功率|数显恒温磁力搅拌器-司乐仪器官网 | 耐磨陶瓷管道_除渣器厂家-淄博浩瀚陶瓷科技有限公司 | [品牌官网]贵州遵义双宁口腔连锁_贵州遵义牙科医院哪家好_种植牙_牙齿矫正_原华美口腔 |