当前位置: 首页 > news >正文

Go 如何优雅退出进程

优雅退出设计步骤

在 Go 项目中,设计优雅退出(Graceful Shutdown)时,通常需要确保在收到退出信号时,程序能够安全地清理资源并优雅地退出。以下是常见的优雅退出设计步骤:

步骤 1:创建 context.Contextcancel 函数

  • 使用 context.WithCancel() 创建一个取消上下文,用于传递取消信号。
  • cancel() 函数可以在收到退出信号时调用,从而通知所有正在运行的 goroutine 停止执行。

步骤 2:通过 context.WithCancel() 创建取消上下文

  • 为确保优雅退出,cancel() 函数需要在主线程的退出信号处理之前执行,保证所有协程能够及时响应取消信号。

步骤 3:处理所有协程的退出

  • 启动多个协程并确保它们能够响应 ctx.Done() 信号,及时停止执行并清理资源。
  • 使用 select 语句监听 ctx.Done(),以便协程能够在收到取消信号时退出。

步骤 4:触发 cancel() 并等待协程退出

  • 在收到退出信号(如系统信号 SIGINT, SIGTERM 等)时,优先调用 cancel(),以确保通知所有正在运行的协程退出。
  • 然后等待所有协程退出,通常使用 sync.WaitGroup 来等待所有协程完成退出。
package mainimport ("context""fmt""os""os/signal""sync""syscall""time"
)func doWork(ctx context.Context, id int, wg *sync.WaitGroup) {defer wg.Done()for {select {case <-ctx.Done():// 当收到取消信号时,退出 goroutinefmt.Printf("goroutine %d: work cancelled\n", id)returndefault:// 模拟工作fmt.Printf("goroutine %d: working...\n", id)time.Sleep(1 * time.Second)}}
}func main() {// 创建一个取消上下文ctx, cancel := context.WithCancel(context.Background())defer cancel()var wg sync.WaitGroup// 启动多个 goroutinefor i := 0; i < 3; i++ {wg.Add(1)go doWork(ctx, i, &wg)}// 捕获终止信号signalChan := make(chan os.Signal, 1)// syscall.SIGINT: 终端执行 Ctrl + C// syscall.SIGTERM: 终端执行 kill $pid// syscall.SIGQUIT: 终端执行 Ctrl + \signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT)// 等待退出信号select {case <-signalChan:// 在退出信号到达时,先执行 cancel,发出取消信号fmt.Println("Received termination signal. Cancelling context...")cancel()// 等待所有 goroutine 完成退出wg.Wait()fmt.Println("Graceful shutdown completed.")}
}

相关文章:

Go 如何优雅退出进程

优雅退出设计步骤 在 Go 项目中&#xff0c;设计优雅退出&#xff08;Graceful Shutdown&#xff09;时&#xff0c;通常需要确保在收到退出信号时&#xff0c;程序能够安全地清理资源并优雅地退出。以下是常见的优雅退出设计步骤&#xff1a; 步骤 1&#xff1a;创建 contex…...

#Vue3篇: 无感刷新token的原理JSESSIONID无感刷新和JWT接口刷新

基于这个后端是怎么更新token的 为了理解后端是如何更新 Token 的&#xff0c;我们需要考虑一个典型的基于 Token 的身份验证流程&#xff0c;特别是涉及 JSESSIONID 和自定义 Token&#xff08;如 JWT, JSON Web Token&#xff09;的情况。 下面我将介绍两种常见的更新 Token …...

从零开始学桶排序:Java 示例与优化建议

目录 一、桶排序的工作原理 二、适用场景 三、桶排序的时间复杂度 四、Java 实现桶排序 桶排序&#xff08;Bucket Sort&#xff09;是一种基于分桶的排序算法&#xff0c;适用于输入数据分布较均匀的场景。它通过将元素分配到不同的“桶”中&#xff0c;然后对每个桶内的元…...

自定义luacheck校验规则

安装运行环境 安装环境及源码解析&#xff0c;参考&#xff1a;LuaCheck校验原理解析 自定义校验规则 从代码中可以看出&#xff0c;定义一条规则有以下关键点&#xff1a; 需要定义告警信息&#xff1a;由键值对组成&#xff0c;key为告警编码&#xff08;不一定为纯数字&…...

Mac连接云服务器工具推荐

文章目录 前言步骤1. 下载2. 安装3. 常用插件安装4. 连接ssh测试5. 连接sftp测试注意&#xff1a;ssh和sftp的区别注意&#xff1a;不同文件传输的区别解决SSL自动退出 前言 Royal TSX是什么&#xff1a; Royal TSX 是一款跨平台的远程桌面和连接管理工具&#xff0c;专为 mac…...

【react】Redux的设计思想与工作原理

Redux 的设计理念 Redux 的设计采用了 Facebook 提出的 Flux 数据处理理念 在 Flux 中通过建立一个公共集中数据仓库 Store 进行管理&#xff0c;整体分成四个部分即: View &#xff08;视图层&#xff09;、Action &#xff08;动作&#xff09;、Dispatcher (派发器)、Stor…...

深入解析Android JNI:以Visualizer为例

深入解析Android JNI:以Visualizer为例 引言 Java Native Interface (JNI) 是Java平台提供的一种机制,允许Java代码与本地代码(如C/C++)进行交互。在Android开发中,JNI被广泛用于性能优化、访问底层系统API、以及复用现有的C/C++库。本文将通过Android中的Visualizer类,…...

Java基于SpringBoot的甘肃非物质文化网站的设计与实现,附源码

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…...

Unity小白工作心得(无限记录)

24届毕业&#xff0c;11月才找到工作在一家小公司。工作两个月了&#xff0c;遇到最大的问题就是探索新知识&#xff0c;每天都是摸索式前进&#xff0c;因为工作面临着交付&#xff0c;你不得不想尽办法解决问题然后交给上面&#xff0c;但其他程序员用的引擎不一样&#xff0…...

STC单片机内部常见寄存器及其作用

STC单片机内部常见寄存器及其作用 STC单片机是基于8051架构的增强型单片机&#xff0c;广泛应用于嵌入式系统中。其内部有多个特殊功能寄存器&#xff08;SFR, Special Function Register&#xff09;&#xff0c;用于控制硬件模块&#xff08;如定时器、串口、中断等&#xf…...

【亚马逊云】基于Amazon EC2实例部署 NextCloud 云网盘并使用 Docker-compose 搭建 ONLYOFFICE 企业在线办公应用软件

文章目录 1. 部署EC2实例2. 安装 Docker 服务3. 安装docker-compose4. 创建Docker-compose文件5. 创建nginx.conf文件6. 运行docker-compose命令开始部署7. 访问ONLYOFFICE插件8. 访问NextCloud云盘9. 下载并启用ONLYOFFICE插件10. 上传文件测试11. 所遇问题12. 参考链接 1. 部…...

vim、watch、cp和mv

一、vim使用技巧 vim主配置文件&#xff1a;/etc/vimrc &#xff08;对所有用户都生效&#xff09; vim子配置文件&#xff1a;vim ~/.vimrc (只对当前用户生效&#xff09; 可写入&#xff1a; set nu 显示行号 ts2 tab键长度为两个空格&#xff08;默认为8个空格…...

【Linux】:线程安全 + 死锁问题

&#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;Linux—登神长阶 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; 1. 线程安全和重入问题&…...

HarmonyOS Next 应用元服务开发-应用接续动态配置迁移保持迁移连续性

保证迁移连续性&#xff0c;由于迁移加载时&#xff0c;目标端拉起的应用可能执行过自己的迁移状态设置命令&#xff08;如&#xff1a;冷启动时目标端在onCreate中设置了INACTIVE&#xff1b;热启动时对端已打开了不可迁移的页面&#xff0c;迁移状态为INACTIVE等情况&#xf…...

重装操作系统后 Oracle 11g 数据库数据还原

场景描述&#xff1a; 由于SSD系统盘损坏&#xff0c;更换硬盘后重装了操作系统&#xff0c;Oracle数据库之前安装在D盘(另一个硬盘)&#xff0c;更换硬盘多添加一个盘符重装系统后盘符从D变成E&#xff0c;也就是之前的D:/app/... 变成了现在的 E:/app/...&#xff0c;重新安装…...

《Vue3实战教程》39:Vue3无障碍访问

如果您有疑问&#xff0c;请观看视频教程《Vue3实战教程》 无障碍访问​ Web 无障碍访问 (也称为 a11y) 是指创建可供任何人使用的网站的做法——无论是身患某种障碍、通过慢速的网络连接访问、使用老旧或损坏的硬件&#xff0c;还是仅处于某种不方便的环境。例如&#xff0c;…...

Linux-Redis哨兵搭建

环境资源准备 主机名IP端口号角色vm1192.168.64.156379/26379mastervm2192.168.64.166379/26379slavevm3192.168.64.176379/26379slave 6379为redis服务暴露端口号、26379为sentinel暴露端口号。 安装Redis # 包文件下载 wget https://github.com/redis/redis/archive/7.2.2…...

数据分析思维(六):分析方法——相关分析方法

数据分析并非只是简单的数据分析工具三板斧——Excel、SQL、Python&#xff0c;更重要的是数据分析思维。没有数据分析思维和业务知识&#xff0c;就算拿到一堆数据&#xff0c;也不知道如何下手。 推荐书本《数据分析思维——分析方法和业务知识》&#xff0c;本文内容就是提取…...

Go基础之环境搭建

文章目录 1 Go1.1 简介1.1.1 定义1.1.2 特点用途 1.2 环境配置1.2.1 下载安装1.2.2 环境配置1.2.2.1 添加环境变量1.2.2.2 各个环境变量理解 1.2.3 验证环境变量 1.3 包管理工具 Go Modules1.3.1 开启使用1.3.2 添加依赖包1.3.3 配置国内包源1.3.3.1 通过 go env 配置1.3.3.2 修…...

Flume的安装和使用

一、安装Flume 1. 下载flume-1.7.0 http://mirrors.shu.edu.cn/apache/flume/1.7.0/apache-flume-1.7.0-bin.tar.gz 2. 解压改名 tar xvf apache-flume-1.7.0-bin.tar.gz mv apache-flume-1.7.0-bin flume 二、配置Flume 1. 配置sh文件 cp conf/flume-env.sh.template …...

原生js封装ajax请求以及css实现提示效果和禁止点击效果

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0,user-scalableno"><title>本地模式网络切换</title>&l…...

idea 的 springboot项目spring-boot-devtools 自动编译 配置热部署

1&#xff0c;设置一 2&#xff0c;设置二 设置二&#xff08;旧版本&#xff09; CtrlShiftAlt/ 点击弹出框中Registry... 引入&#xff08;如果报错&#xff0c;换不同的版本&#xff09; <dependency><groupId>org.springframework.boot</groupId><a…...

算法 class 005 (对数器C语言实现)

对数器的概念&#xff1a; 用来测试你的算法是否正确。 怎么做呢&#xff1f; 1&#xff1a;比如&#xff0c;写个冒泡排序&#xff0c;作为对比的对象 2&#xff1a;生成一个随机数 数组&#xff0c;用来测试 3&#xff1a;用冒泡排序和你想要验证的那个排序算法&#xff0c;同…...

靶场搭建问题(技巧)总结

目录 DVWA靶场问题 待续、更新中...... DVWA靶场 问题 错误信息 Parse error: syntax error, unexpected ‘[’, expecting ‘)’ in C:\Softwares\phpstudy\PHPTutorial\WWW\dvwa\dvwa\includes\dvwaPage.inc.php on line 52 原因 phpstudy2018所使用的php版本过低&#xff0c…...

Elasticsearch DSL版

文章目录 1.索引库操作创建索引库&#xff1a;删除索引库&#xff1a;查询索引库&#xff1a;修改索引库&#xff1a;总结 2.文档操作创建文档&#xff1a;查询文档&#xff1a;删除文档&#xff1a;全量修改文档&#xff1a;增量修改文档&#xff1a;总结 3.DSL查询语法&#…...

在K8S中,Pod请求另一个Pod偶尔出现超市或延迟,如何排查?

在Kubernetes中&#xff0c;当Pod请求另一个Pod时偶尔出现超时或延迟&#xff0c;可能是由于多种原因造成的。以下是一些建立的排查步骤&#xff1a; 1. 检查网络配置和插件&#xff1a; 确认你的kubernetes集群使用了合适的网络插件&#xff08;如Calico、Flannel等&#xf…...

Echarts实现大屏可视化2

目录 一、效果展示 二、说明 2.1 销售额统计图表 2.2 全国热榜模块 三、边框图片【border-image】 3.1 使用场景 3.2 边框图片切图原理 3.3 边框图片语法【重要】 四、代码展示 4.1 展示页面 4.2 数据概览区域 4.3 监控区域 4.4 点位分布统计区域 4.5 设备数据统…...

HarmonyOS NEXT 应用开发练习:智能视频推荐

一、整体思路 本DEMO展示了如何在HarmonyOS NEXT平台上开发一个智能视频推荐应用。应用通过模拟的用户偏好数据&#xff0c;为用户推荐可能感兴趣的视频。用户可以通过滑动屏幕查看推荐的视频列表&#xff0c;并点击视频封面进入播放页面&#xff0c;本例中仅模拟点击效果&…...

FPGA(二)组成结构基础内容

1. FPGA的基本结构 FPGA主要由以下部分组成&#xff1a; &#xff08;1&#xff09;可编程逻辑单元&#xff08;CLB&#xff09;&#xff1a;CLB是FPGA中最基本的逻辑单元&#xff0c;由查找表&#xff08;LUT&#xff09;和触发器组成&#xff0c;可实现任意逻辑功能。查找表…...

linux中执行命令

1.1 命令格式 命令格式&#xff1a; 主命令 选项 参数&#xff08;操作对象&#xff09; 命令分为两类&#xff1a; 内置命令&#xff08; builtin &#xff09;&#xff1a;由 shell 程序自带的命令 外部命令&#xff1a;有独立的可执行程序文件&#xff0c;文件名即命令…...

《Java 数据结构》

《Java 数据结构》 1. 概述 Java 数据结构是计算机科学中的一种基础概念&#xff0c;它涉及到数据的组织和存储方式&#xff0c;以便能够高效地访问和修改数据。在 Java 中&#xff0c;数据结构通常通过类和接口来实现&#xff0c;这些类和接口提供了用于操作数据的各种方法。…...

C# 设计模式(结构型模式):装饰器模式

C# 设计模式&#xff08;结构型模式&#xff09;&#xff1a;装饰器模式 在软件开发中&#xff0c;面对需要扩展功能但又不想修改已有代码的情况时&#xff0c;装饰模式&#xff08;Decorator Pattern&#xff09;是一个非常有用的设计模式。装饰模式允许我们在不改变对象自身…...

ubuntu初始配置

ubuntu初始配置 vm下ubuntu安装vmtools安装常用工具ubuntu终端美化安装ssh使用apt安装时出现错误解决办法 vm下ubuntu安装vmtools //安装vmtools sudo apt-get install open-vm-tools //桌面组件提供了更好的集成体验&#xff0c;包括拖放文件和共享剪贴板等功能 sudo apt-get…...

Spark Runtime Filter

Runtime Filter 参考链接&#xff1a; https://docs.google.com/document/d/16IEuyLeQlubQkH8YuVuXWKo2-grVIoDJqQpHZrE7q04/edit?tabt.0https://www.modb.pro/db/557718https://issues.apache.org/jira/browse/SPARK-32268https://github.com/apache/spark/pull/35789https…...

《Vue3实战教程》42:Vue3TypeScript 与组合式 API

如果您有疑问&#xff0c;请观看视频教程《Vue3实战教程》 TypeScript 与组合式 API​ 这一章假设你已经阅读了搭配 TypeScript 使用 Vue 的概览。 为组件的 props 标注类型​ 使用 <script setup>​ 当使用 <script setup> 时&#xff0c;defineProps() 宏函数支…...

【Hadoop】Hadoop安全之Knox网关

目录 一、概述 2.1 knox介绍 2.2 版本信息 二、部署 三、验证Knox网关 3.1 Hdfs RESTFULL 3.2 HDFSUI 3.3 YARNUI 3.4 HBASEUI 一、概述 2.1 knox介绍 Apache Knox网关是一个用于与Apache Hadoop部署的REST api和ui交互的应用程序网关。Knox网关为所有与Apache Hadoop…...

UML之关联

关联指两个类之间的各种联系。UML使用各种单实线表示关联&#xff0c;这个单实线可以是直线&#xff08;垂直的、水平的或者倾斜的&#xff09;、折线甚至曲线。 事实上&#xff0c;关联也是展示类的属性的另一外的一种形式。例如在下图中&#xff0c;我们通过一条实线连接类B…...

大数据面试笔试宝典之大数据运维面试

1.大数据集群节点规划 1.HDFS 集群节点规划 假如业务系统数据量每天增量 50T ,保留周期为 30 天,那么...

Matlab全局变量用法及其实例分析

⭕⭕ 目 录 ⭕⭕ 一、全局变量使用说明二、全局变量的用法实例演示2.1 实例演示2.2 修改global 一、全局变量使用说明 全局变量是指在不同的工作空间以及基本的工作空间中可以共享的变量。用户只需要在主程序或者任何子程序中声明一个或多个全局变量&#xff0c;则函数和主程序…...

leetcode hot 100 跳跃游戏

55. 跳跃游戏 已解答 中等 相关标签 相关企业 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则…...

CG顶会论文阅读|《科技论文写作》硕士课程报告

文章目录 一、基本信息1.1 论文基本信息1.2 课程基本信息1.3 博文基本信息 二、论文评述&#xff08;中英双语&#xff09;2.1 研究问题&#xff08;Research Problem&#xff09;2.2 创新点&#xff08;Innovation/Contribution&#xff09;2.3 优点&#xff08;Why this pape…...

短视频矩阵系统搭建开发指导

在数字化营销的广阔天地中&#xff0c;抖音短视频已迅速崛起为一个拥有巨大影响力的社交媒体平台。随着其受众范围的日益扩大&#xff0c;采用有效的搜索引擎优化&#xff08;SEO&#xff09;策略以增强视频的曝光度和吸引流量变得至关重要。本文旨在阐述一种专为抖音短视频量身…...

LeetCode热题100-移动零【JavaScript讲解】

题目&#xff1a; 根据本题想思路&#xff1a; 快指针和慢指针同时移动&#xff0c;当遍历的值不为0的时候&#xff0c;将快指针的值赋给慢指针&#xff0c;如果遍历到0&#xff0c;快指针继续移动&#xff0c;慢指针不动等待被覆盖。之后使用fill方法填充0。具体答案放在最后…...

MarkDown 的 mermaid gantt(甘特图)、mermaid sequenceDiagram (流程图) 语法解析和应用

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 MarkDown 的 mermaid gantt、mermaid sequenceDiagram 语法解析和应用前言mermaid gan…...

Flask 与 SocketIO 正确初始化及最佳实践调试

1、问题 我使用Flask和Flask-SocketIO 来做 Websocket 链接。前期正常使用&#xff0c;但是后期布置修改什么导致Websocket连接失败。排查需求&#xff0c;才发现初始化不正常导致。 SocketIO 和 Flask 应用的初始化顺序和引用循环的问题 2、环境 python-engineio4.11.1 py…...

Spring Boot 3 文件上传、多文件上传、大文件分片上传、文件流处理以及批量操作

在 Spring Boot 3 中&#xff0c;可以通过内置的文件处理机制结合 Java 的 IO 流与多线程技术&#xff0c;实现文件上传、多文件上传、大文件分片上传、文件流处理以及批量操作的需求。以下是详细实现步骤&#xff1a; 1. 单文件上传 控制器代码 import org.springframework…...

Springcloud项目-前后端联调(一)

项目采用SpringCloud整体构建&#xff0c;nacos作为注册中心&#xff0c;Mysql和Redis进行数据存储&#xff0c;整体项目类似于平时使用的出行APP,idea2023编写后端&#xff0c;vscode编写前端 后端代码先前已经编写完毕 这部分功能主要是通过前端输入出发地和目的地之后调用…...

树莓派之旅-第一天 系统的烧录和设置

自言自语&#xff1a; 在此记录一下树莓派的玩法。以后有钱了买点来玩啊草 系统的安装烧录 系统下载 树莓派官网&#xff1a;https://www.raspberrypi.com/ 首页点击SoftWare进入OS下载页面 这里是安装工具&#xff1a;安装工具负责将系统镜像安装到sd卡中 点击下载符合自己…...

SQL 中的 EXISTS

我们先从 SQL 中最基础的 WHERE 子句开始。 比如下面这条 SQL 语句&#xff1a; 很显然&#xff0c;在执行这条 SQL 语句的时候&#xff0c;DBMS 会扫描 Student 表中的每一条记录&#xff0c;然后把符合 Sdept IS 这个条件的所有记录筛选出来&#xff0c;并放到结果集里面去…...

WebSocket 的封装使用

import { ElMessage } from "element-plus";// 全局WebSocket实例 let ws null; let isConnected false; let currentWsUrl ; // 用于存储当前的wsUrl let baseURL ws://XXX.com:8081;const initWebSocket (wsUrl, sendData) > {return new Prom…...