首页 > 其他分享 >安全启动、优雅退出

安全启动、优雅退出

时间:2023-08-23 20:23:40浏览次数:32  
标签:服务 启动 syscall 优雅 signalCh 退出 main os

在服务开发的时候,可能会遇到服务频繁启动或者频繁销毁的情况,需要分配和回收服务的资源;同时如果在服务关闭处理的不优雅的情况,还可能会丢失数据,因此服务设计的时候,需要考虑如何优雅的对服务进行启停。

 

package main

import (
    "fmt"
    "os"
    "os/signal"
    "sync"
    "syscall"
)

func main() {
    svr := MyService{}
    svr.Start()

    // 监听终止信号
    signalCh := make(chan os.Signal, 1)
    signal.Notify(signalCh, syscall.SIGINT, syscall.SIGTERM)

    // 等待接收终止信号
    <-signalCh

    svr.Stop()

    fmt.Println("Exiting program...")
    os.Exit(0)
}

type MyService struct {
    isOpen bool
    rwLock sync.RWMutex // 读共享,写排斥
    stop   int32
    once   sync.Once
}

func (s *MyService) Start() {
    s.rwLock.Lock()
    defer s.rwLock.Unlock()
    if s.isOpen {
        return
    }

    // 初始化资源

    s.isOpen = true
}

func (s *MyService) Stop() {
    s.once.Do(func() {
        // 获取写锁。如果有其他goroutine持有读锁或写锁,当前goroutine会阻塞直到获取到写锁为止
        s.rwLock.Lock()
        defer s.rwLock.Unlock()
        if !s.isOpen {
            return
        }

        // 释放资源

        s.isOpen = false
    })
}

func (s *MyService) Handle() {
    // 获取读锁。如果有其他goroutine持有写锁,当前goroutine会阻塞直到获取到读锁为止
    s.rwLock.RLock()
    defer s.rwLock.RUnlock()

    if !s.isOpen {
        return
    }
    // 业务处理
}

 

标签:服务,启动,syscall,优雅,signalCh,退出,main,os
From: https://www.cnblogs.com/-citywall123/p/17652690.html

相关文章

  • 国标GB28181视频平台EasyGBS国标平台无法正常启动的问题解决方案
    EasyGBS国标视频云服务是基于国标GB/T28181协议的视频能力平台,可实现的视频功能包括:实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。平台部署简单、可拓展性强,支持将接入的视频流进行全终端、全平台分发,分发的视频流包括RTSP、RTMP、FLV、HLS、WebRTC......
  • 视频集中存储/直播点播平台EasyDSS内核无法启动是什么原因?
    视频推拉流EasyDSS视频直播点播平台,集视频直播、点播、转码、管理、录像、检索、时移回看等功能于一体,可提供音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务。有用户反馈,下载了视频直播点播平台EasyDSS最新版本,在启动服务时发现,出现了报错并且平台也无......
  • 视频集中存储/直播点播平台EasyDSS内核无法启动是什么原因?
    视频推拉流EasyDSS视频直播点播平台,集视频直播、点播、转码、管理、录像、检索、时移回看等功能于一体,可提供音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务。有用户反馈,下载了视频直播点播平台EasyDSS最新版本,在启动服务时发现,出现了报错并且平台也无法访......
  • 【操作系统】1.操作系统启动
     1.打开电源(1)x86PC开机时CPU处于实模式,实模式的寻址方式是CS:IP(CS左移4位+IP)(2)开机时段寄存器CS=0xFFFF,偏移量IP=0x0000,段寄存器左移4位加上偏移量是实际地址,也就是寻址地址为0xFFFF0(ROMBIOS映射区)(3)检查RAM,键盘,显示器,磁盘(4)将0磁道0扇区512个字节读入0x7c00处(操作系统......
  • “产业应用创新奖2023”启动征集
    当前,人工智能已经成为新一轮科技革命和产业变革的重要驱动力量,基于强算法、大算力和大数据的大模型成为主流方向。文心大模型和飞桨一直致力于发挥算法模型技术优势,助力AI大生产加速升级。文心+飞桨赋能千行百业,产业创新不断涌现数字医疗中康科技:大模型助力医疗技术创新中康科技基......
  • 如何优雅的使用telnet测试端口连通性
    telnet命令是TELNET协议的用户接口,它支持两种模式:命令模式和会话模式,虽然telnet支持许多命令,但大部分情况下,我们只是使用它查看目标主机是否打开了某端口(默认是23)。其执行结果有两种:端口未打开$telnet101.199.97.6562715Trying101.199.97.65...telnet:connecttoaddres......
  • Android入门教程之Activity(生命周期,启动...)
    Activity是一个应用组件,用户可与其提供的屏幕进行交互,以执行拨打电话、拍摄照片、发送电子邮件或查看地图等操作。每个Activity都会获得一个用于绘制其用户界面的窗口。窗口通常会充满屏幕,但也可小于屏幕并浮动在其他窗口之上。Activity1.Activity的使用我们新建的工程中带有......
  • Docker开启和关闭容器自启动
    启动容器增加–-restart=always参数设置自启动dockerrun--restart=always--nametest--net=host-dtest//test为镜像河容器名称已启动的容器设置自启动dockerupdate–-restart=always容器ID或者容器名称已启动的容器关闭自启动dockerupdate--restart=no容器ID或者容......
  • 珂朵莉树——优雅的暴力
    珂朵莉树引入珂朵莉树(ChthollyTree),又名老司机树(OldDriverTree)。起源于CF896C。这种想法的本质是基于数据随机的「颜色段均摊」,而不是一种数据结构。前置需要了解STL的set的基本用法。比如:insert(x) 当容器中没有等价元素的时候,将元素x插入到 set 中。er......
  • MyBatis-Flex:超越Mybatis-plus的优雅魅力
    MyBatis-Flex一个优雅的MyBatis增强框架。更轻量MyBatis-Flex除了MyBatis本身,再无任何第三方依赖,因此会带来更高的自主性、把控性和稳定性。在任何一个系统中,依赖越多,稳定性越差。更灵活MyBatis-Flex提供了非常灵活的QueryWrapper,支持关联查询、多表查询、多主键、逻辑删除......