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

如何优雅的关闭GoWeb服务器

以下内容均为Let’s Go Further内容节选以及作者本人理解。
这里创建了一个后台进程用于捕获关闭信号,在后台进程中,主要内容为:

  1. 创建一个缓冲通道 quit
  2. 使用signal.Notify函数监听并捕获关机信号SIGINT,SIGTERM,在捕获关机信号后,缓冲通道取值操作才会执行,取消阻塞。
  3. 随后使用shutdown函数关闭服务器。工作原理是首先关闭所有打开的侦听器,然后关闭所有空闲连接,然后无限期地等待连接返回空闲状态,然后关闭。
  4. 如果关闭连接时发生错误,则将错误存储进入通道,主程序取出错误,取消阻塞。返回错误。
  5. 如果正常关闭连接,app.wg.Wait()等待全部后台进程全部运行结束后放行,随后向错误通道存储空值,放行主程序。此时连接和后台进程全部关闭,打印日志,结束。
package mainimport ("context""errors""fmt""net/http""os""os/signal""syscall""time"
)func (app *application) serve() error {srv := http.Server{Addr:         fmt.Sprintf(":%d", app.config.port),Handler:      app.routes(),IdleTimeout:  time.Minute,ReadTimeout:  10 * time.Second,WriteTimeout: 30 * time.Second,//服务器可以编写自己的日志消息,实现Write方法变成io.Write接口可以将自定义日志传递进去//ErrorLog: log.New(logger, "", 0),}shutdownErr := make(chan error)//开启一个后台进程 捕获关闭信号,关闭所有连接和后台进程,实现优雅的关机go func() {//创建一个通道保存os.Signal值/*在这里使用缓冲通道,如果使用非缓冲通道,quit 通道 在信号发送的时刻没有准备去接收,会错过信号*/quit := make(chan os.Signal, 1)//使用signal.Notify监听SIGINT and SIGTERM信号并将他们传入quit通道。其他信号不会被捕获并保留他们默认的行为。signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)//从通道中读取值,这个操作将被阻塞直到通道接收一个值s := <-quitapp.logger.PrintInfo("shutting down server", map[string]string{"signal": s.String(),})//创建一个5秒的上下文ctx, cancelFunc := context.WithTimeout(context.Background(), 5*time.Second)defer cancelFunc()//服务调用shutdown,如果成功关闭将返回nil,或者返回错误(当关闭一个监听器时遇到问题,或者在到达截止日期时没有完成)/*工作原理是首先关闭所有打开的侦听器,然后关闭所有空闲连接,然后无限期地等待连接返回空闲状态,然后关闭。*//*1. 关闭连接时没有返回错误,说明连接全部关闭,但是还有后台进程,告诉正在执行关闭后台进程,需要等待wg归零。2. 关闭连接出现错误。将err存入通道,放行主程序*///shutdown返回的是一个error类型的变量err := srv.Shutdown(ctx)//通道中存入错误,主程序取消阻塞,继续执行if err != nil {shutdownErr <- err}//正在完成后台进程app.logger.PrintInfo("completing background tasks", map[string]string{"addr": srv.Addr,})app.wg.Wait()//后台进程全部关闭后,放行主程序shutdownErr <- nil}()app.logger.PrintInfo("starting server", map[string]string{"addr": srv.Addr,"env":  app.config.env,})//调用shutdown会造成ListenAndServer立刻返回一个http.ErrServerClosed错误。如果是这个错误,表明我们的程序优雅的关闭了err := srv.ListenAndServe()if !errors.Is(err, http.ErrServerClosed) {return err}//阻塞  关闭后才能继续执行err = <-shutdownErrif err != nil {return err}app.logger.PrintInfo("stopped server", map[string]string{"addr": srv.Addr,})return nil
}

关于使用后台进程运行其他任务时,使用函数background来启动后台进程

func (app *application) background(fn func()) {//开启一个后台进程app.wg.Add(1)go func() {defer app.wg.Done()//使用延迟函数捕获可能出现的panicdefer func() {if err := recover(); err != nil {app.logger.PrintError(fmt.Errorf("%s", err), nil)}}()fn()}()
}

相关文章:

如何优雅的关闭GoWeb服务器

以下内容均为Let’s Go Further内容节选以及作者本人理解。 这里创建了一个后台进程用于捕获关闭信号&#xff0c;在后台进程中&#xff0c;主要内容为&#xff1a; 创建一个缓冲通道 quit使用signal.Notify函数监听并捕获关机信号SIGINT,SIGTERM&#xff0c;在捕获关机信号后…...

AI程序员,开源的Devin,OpenHands 如何使用HuggingFace Inference API

我用了一下&#xff0c;界面这样子&#xff1a; Github&#xff1a;https://github.com/All-Hands-AI/OpenHands OpenHands 如何使用HuggingFace Inference API huggingface/meta-llama/Llama-3.3-70B-Instruct 而不是 meta-llama/Llama-3.3-70B-Instruct 不要设置base URL&…...

【动手学运动规划】 5.2 数值优化基础:梯度下降法,牛顿法

朕四季常服, 不过八套. — 大明王朝1566 道长 &#x1f3f0;代码及环境配置&#xff1a;请参考 环境配置和代码运行! 上一节我们介绍了数值优化的基本概念, 让大家对最优化问题有了基本的理解. 那么对于一个具体的问题, 我们应该如何求解呢? 这一节我们将介绍几个基本的求解…...

电子应用设计方案66:智能打印机系统设计

智能打印机系统设计 一、引言 随着科技的不断发展&#xff0c;打印机也在向智能化方向演进。智能打印机不仅能够提供高质量的打印服务&#xff0c;还具备便捷的操作、智能的管理和连接功能。 二、系统概述 1. 系统目标 - 实现高效、高质量的打印输出。 - 支持多种连接方式&am…...

iClient3D for Cesium 实现限高分析

作者&#xff1a;gaogy 1、背景 随着地理信息技术的发展&#xff0c;三维地球技术逐渐成为了许多领域中的核心工具&#xff0c;尤其是在城市规划、环境监测、航空航天以及军事领域。三维地图和场景的应用正在帮助人们更加直观地理解空间数据&#xff0c;提供更高效的决策支持。…...

AI开发:使用支持向量机(SVM)进行文本情感分析训练 - Python

支持向量机是AI开发中最常见的一种算法。之前我们已经一起初步了解了它的概念和应用&#xff0c;今天我们用它来进行一次文本情感分析训练。 一、概念温习 支持向量机&#xff08;SVM&#xff09;是一种监督学习算法&#xff0c;广泛用于分类和回归问题。 它的核心思想是通过…...

torch.unsqueeze:灵活调整张量维度的利器

在深度学习框架PyTorch中&#xff0c;张量&#xff08;Tensor&#xff09;是最基本的数据结构&#xff0c;它类似于NumPy中的数组&#xff0c;但可以在GPU上运行。在日常的深度学习编程中&#xff0c;我们经常需要调整张量的维度以适应不同的操作和层。torch.unsqueeze函数就是…...

【WRF教程第3.1期】预处理系统 WPS 详解:以4.5版本为例

预处理系统 WPS 详解&#xff1a;以4.5版本为例 每个 WPS 程序的功能程序1&#xff1a;geogrid程序2&#xff1a;ungrib程序3&#xff1a;metgrid WPS运行&#xff08;Running the WPS&#xff09;步骤1&#xff1a;Define model domains with geogrid步骤2&#xff1a;Extract…...

SD ComfyUI工作流 根据图像生成线稿草图

文章目录 线稿草图生成SD模型Node节点工作流程工作流下载效果展示线稿草图生成 该工作流的设计目标是将输入的图像转换为高质量的线稿风格输出。其主要流程基于 Stable Diffusion 技术,结合文本和图像条件,精确生成符合预期的线条艺术图像。工作流的核心是通过模型的条件设置…...

挑战一个月基本掌握C++(第六天)了解函数,数字,数组,字符串

一 C函数 函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数&#xff0c;即主函数 main() &#xff0c;所有简单的程序都可以定义其他额外的函数。 您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的&#xff0c;但在逻辑上&#xff…...

git中的多人协作

目录 1.1多人协作1.1.1创建仓库1.1.2协作处理1.1.3冲突处理 1.2分支推送协作1.3分支拉取协作1.4远程分支的删除 1.1多人协作 1.1.1创建仓库 新建两个文件夹&#xff0c;不需要初始化为git仓库&#xff0c;直接克隆远程仓库命名testGit1&#xff0c;testGit2 指定本地仓库级别…...

解决新安装CentOS 7系统mirrorlist.centos.org can‘t resolve问题

原因 mirrorlist.centos.org yum源用不了 解决办法就是 # cd /etc/yum.repos.d/ # mv CentOS-Base.repo CentOS-Base.repo_bak # vim CentOS-Base.repoCentOS系统操作 # mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/*.repo_bak # curl -o /etc/yum.repos.d/CentOS-Linux-Ba…...

RK3588 , mpp硬编码yuv, 保存MP4视频文件.

RK3588 , mpp硬编码yuv, 保存MP4视频文件. ⚡️ 传送 ➡️ Ubuntu x64 架构, 交叉编译aarch64 FFmpeg mppRK3588, FFmpeg 拉流 RTSP, mpp 硬解码转RGBRk3588 FFmpeg 拉流 RTSP, 硬解码转RGBRK3588 , mpp硬编码yuv, 保存MP4视频文件....

Elasticsearch:什么是查询语言?

查询语言定义 查询语言包括数据库查询语言 (database query language - DQL)&#xff0c;是一种用于查询和从数据库检索信息的专用计算机语言。它充当用户和数据库之间的接口&#xff0c;使用户能够管理来自数据库管理系统 (database management system - DBMS) 的数据。 最广…...

均值聚类算法

K-均值聚类算法是一种常用的无监督学习算法&#xff0c;用于将数据集划分为 K 个簇。它基于以下的思想&#xff1a;通过计算数据点与各个簇中心之间的距离来确定数据点所属的簇&#xff0c;并更新簇中心来最小化簇内数据点的平方误差。K-均值算法的步骤如下&#xff1a; 1. 选…...

MySQL 中快速插入大量数据

在 MySQL 中快速插入大量数据&#xff08;例如 20 万条记录&#xff09;可以通过多种方法实现。以下是一些优化技巧和步骤&#xff0c;可以帮助你高效地插入大量数据&#xff1a; 1. 禁用索引和约束&#xff08;如果可能&#xff09; 在插入大量数据之前&#xff0c;禁用索引和…...

腾讯云智能结构化OCR:以多模态大模型技术为核心,推动跨行业高效精准的文档处理与数据提取新时代

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大三学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…...

最大似然检测在通信解调中的应用

最大似然检测&#xff08;Maximum Likelihood Detection&#xff0c;MLD&#xff09;&#xff0c;也称为最大似然序列估计&#xff08;Maximum Likelihood Sequence Estimation&#xff0c;MLSE&#xff09;&#xff0c;是一种在通信系统中广泛应用的解调方法。其核心思想是在给…...

SKETCHPAD——允许语言模型生成中间草图,在几何、函数、图算法和游戏策略等所有数学任务中持续提高基础模型的性能

概述 论文地址&#xff1a;https://arxiv.org/pdf/2406.09403 素描是一种应用广泛的有效工具&#xff0c;包括产生创意和解决问题。由于素描能直接传达无法用语言表达的视觉和空间信息&#xff0c;因此从古代岩画到现代建筑图纸&#xff0c;素描在世界各地被用于各种用途。儿童…...

[JAVA备忘录] Lambda 表达式简单介绍

目录 前言 函数式接口 Lambda 表达式使用实例 简单示例 1. 无参数&#xff0c;无返回值 2. 有参数&#xff0c;无返回值 3. 无参数&#xff0c;有返回值 4. 有参数&#xff0c;有返回值 解释&#xff1a; 集合框架 1.forEach&#xff1a;遍历集合 2.排序&#xff1…...

【力扣100题】09.反转链表

一、题目描述 给定单链表的头节点 head&#xff0c;反转链表并返回反转后的链表。 示例 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]输入&#xff1a;head [] 输出&#xff1a;[]二、核心思路 关键观察…...

PyTorch 2.8镜像保姆级教程:RTX 4090D下HuggingFace Datasets高效加载

PyTorch 2.8镜像保姆级教程&#xff1a;RTX 4090D下HuggingFace Datasets高效加载 1. 环境准备与快速验证 1.1 镜像基本信息确认 本教程使用的PyTorch 2.8镜像已针对RTX 4090D显卡进行深度优化&#xff0c;主要配置如下&#xff1a; 核心组件&#xff1a;PyTorch 2.8 CUDA…...

李慕婉-仙逆-造相Z-Turbo AI核心原理科普:如何用Transformer理解并生成人类语言

李慕婉-仙逆-造相Z-Turbo AI核心原理科普&#xff1a;如何用Transformer理解并生成人类语言 你有没有想过&#xff0c;当你和“李慕婉-仙逆-造相Z-Turbo”这样的AI模型对话时&#xff0c;它到底是怎么“听懂”你的话&#xff0c;又“想”出那些回答的&#xff1f;它不像我们人…...

Qt网络编程实战:基于QTcpSocket构建带进度反馈的可靠文件传输系统

1. 为什么需要带进度反馈的文件传输系统 在开发桌面应用时&#xff0c;文件传输是个绕不开的刚需功能。特别是传输大文件时&#xff0c;用户最怕的就是看着界面发呆——不知道传输进行到哪一步了&#xff0c;也不知道还要等多久。我做过一个医疗影像传输系统&#xff0c;医生们…...

ShardingSphere-Proxy 5.2 容器化部署与开发调试实战指南

1. 为什么选择ShardingSphere-Proxy 5.2作为开发调试工具 在分库分表场景下开发应用时&#xff0c;最让人头疼的就是数据查询和调试问题。想象一下&#xff0c;你的订单数据被分散在4个库的8张表中&#xff0c;每次测试时想确认数据是否正确写入&#xff0c;都得手动连接不同数…...

抖音下载器:从零开始,轻松获取无水印视频的完整指南

抖音下载器&#xff1a;从零开始&#xff0c;轻松获取无水印视频的完整指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallb…...

从豆瓣到StyleTalk:手把手教你用真实场景数据微调你的中文对话模型

从豆瓣到StyleTalk&#xff1a;手把手教你用真实场景数据微调你的中文对话模型 当你已经掌握了基座模型微调的基础技能&#xff0c;如何让模型真正理解特定领域的专业术语&#xff0c;或是模仿某种独特的说话风格&#xff1f;本文将带你深入实战&#xff0c;从数据清洗到效果评…...

智能电网RAG优化:闭环协同与精准检索

RAG论文原理解析、公式含义与错误点对点修正方案 一、论文核心原理详细解析(含场景举例) 本文针对通用RAG框架在术语密集、强监管垂直领域(智能电网)的三大原生适配瓶颈,提出了** RAG领域原生闭环协同RAG范式**,核心是将智能电网领域知识嵌入检索-生成-评估全生命周期,…...

STM32L152C段式LCD驱动库深度解析与移植指南

1. 项目概述LCD_DISCO_L152C是专为 STM32L152C-DISCO 开发板设计的 LCD 驱动库&#xff0c;其核心目标是提供轻量、可靠、可移植的底层显示控制能力。该库并非从零构建&#xff0c;而是基于 ST 官方为 STM32L476VG-DISCO&#xff08;如 NUCLEO-L476RG 或 DISCOVERY-BOARD-L476V…...

游戏服务器开发者的选择:用Fastutil的Object2ObjectOpenHashMap优化NPC数据存储

游戏服务器性能优化实战&#xff1a;Fastutil的Object2ObjectOpenHashMap在NPC数据管理中的应用 在大型多人在线游戏&#xff08;MMO&#xff09;开发中&#xff0c;NPC&#xff08;非玩家角色&#xff09;系统的数据管理往往成为性能瓶颈。传统Java集合在高频更新场景下容易引…...