首页 > 编程语言 >Golang实现程序优雅退出的方法 有哪些 ?

Golang实现程序优雅退出的方法 有哪些 ?

时间:2024-01-16 09:00:11浏览次数:25  
标签:err 哪些 fmt stop 优雅 Golang 关闭 Println os

Golang实现程序优雅退出的方法 有哪些 ? 原创 磊丰 Go语言圈 2024-01-16 08:31 发表于广东 听全文 学习与交流:Go语言技术微信群 商务合作加微信:LetsFeng       现在就开始你的Go语言学习之旅吧!人生苦短,let’s Go.             Goland 全家桶激活码,永久有效,亲测可用,限时免费   获取链接地址:https://web.52shizhan.cn   在Go语言中,实现程序的优雅退出是一项重要的任务,特别是在涉及到HTTP服务器、gRPC服务器、以及其他后台工作的情况下。以下是一些常见的平滑关闭方法:   1. HTTP Server 平滑关闭 Go 1.8及以上版本提供了 http.Server 结构的 Shutdown 方法,用于平滑关闭HTTP服务器。   package main   import (     "context"     "net/http"     "os"     "os/signal"     "time" )   func main() {     mux := http.NewServeMux()     mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {         w.Write([]byte("Hello, World!"))     })       server := &http.Server{         Addr: ":8080",         Handler: mux,     }       go func() {         if err := server.ListenAndServe(); err != nil {             if err != http.ErrServerClosed {                 // 处理监听失败的错误             }         }     }()       // 等待中断信号来优雅地关闭服务器     stop := make(chan os.Signal, 1)     signal.Notify(stop, os.Interrupt)       <-stop // 等待中断信号     ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)     defer cancel()       if err := server.Shutdown(ctx); err != nil {         // 处理关闭服务器时的错误     } }           2. gRPC Server 平滑关闭 gRPC服务器的平滑关闭可以通过 GracefulStop 方法实现。   package main   import (     "context"     "fmt"     "net"     "os"     "os/signal"       "google.golang.org/grpc"     "google.golang.org/grpc/reflection" )   type Greeter struct{}   func (s *Greeter) SayHello(ctx context.Context, in *HelloRequest) (*HelloReply, error) {     return &HelloReply{Message: "Hello " + in.Name}, nil }   func main() {     listener, err := net.Listen("tcp", ":50051")     if err != nil {         // 处理监听失败的错误     }       server := grpc.NewServer()     RegisterGreeterServer(server, &Greeter{})       // 在gRPC服务上启用反射服务     reflection.Register(server)       go func() {         if err := server.Serve(listener); err != nil {             // 处理gRPC服务启动错误         }     }()       // 等待中断信号来优雅地关闭gRPC服务器     stop := make(chan os.Signal, 1)     signal.Notify(stop, os.Interrupt)       <-stop // 等待中断信号     fmt.Println("Shutting down gRPC server...")       server.GracefulStop()     fmt.Println("gRPC server gracefully stopped") } 3. Worker 协程平滑关闭 对于worker协程的平滑关闭,可以使用 context.Context 实现。   package main   import (     "context"     "fmt"     "os"     "os/signal"     "sync"     "time" )   func worker(ctx context.Context, wg *sync.WaitGroup) {     defer wg.Done()       for {         select {         case <-ctx.Done():             fmt.Println("Worker received shutdown signal")             return         default:             // 执行工作任务             fmt.Println("Working...")             time.Sleep(time.Second)         }     } }   func main() {     ctx, cancel := context.WithCancel(context.Background())     var wg sync.WaitGroup       // 启动worker协程     wg.Add(1)     go worker(ctx, &wg)       // 等待中断信号来优雅地关闭worker协程     stop := make(chan os.Signal, 1)     signal.Notify(stop, os.Interrupt)       <-stop // 等待中断信号     fmt.Println("Shutting down...")       // 发送关闭信号给worker协程     cancel()     wg.Wait()     fmt.Println("Shutdown complete") }   4. 实现 `io.Closer` 接口的自定义服务平滑关闭 实现 io.Closer 接口的服务可以通过调用 Close 方法进行平滑关闭。   package main   import (     "fmt"     "os"     "os/signal"     "sync"     "time" )   type MyService struct {     mu sync.Mutex     // 其他服务相关的字段 }   func (s *MyService) Close() error {     s.mu.Lock()     defer s.mu.Unlock()       // 执行关闭服务的操作     fmt.Println("Closing MyService...")     return nil }   func main() {     service := &MyService{}       // 等待中断信号来优雅地关闭服务     stop := make(chan os.Signal, 1)     signal.Notify(stop, os.Interrupt)       <-stop // 等待中断信号     fmt.Println("Shutting down...")       // 调用Close方法进行平滑关闭     if closer, ok := service.(interface{ Close() error }); ok {         if err := closer.Close(); err != nil {             fmt.Println("Error closing service:", err)         }     }     fmt.Println("Shutdown complete") } 以上是一些Golang中实现程序优雅退出的方法,具体的实现方式取决于你的应用程序结构和使用的库。   在实际应用中,你可能需要组合使用这些方法以确保整个应用程序在退出时都能够平滑关闭。       文章首发: 更多相关Go语言的技术文章或视频教程,请关注本公众号获取并查看,感谢你的支持与信任!       阅读 67   Go语言圈 ​       人划线    

标签:err,哪些,fmt,stop,优雅,Golang,关闭,Println,os
From: https://www.cnblogs.com/cheyunhua/p/17966785

相关文章

  • 在Linux下, 不使用包管理器安装Golang sdk
    尝试从targz安装go下面这个是go官网的,注意使用代理下载;wgethttps://go.dev/dl/go1.21.6.linux-amd64.tar.gztar-zxvfgo1.13.1.linux-amd64.tar.gzmvgo//usr/local/将go添加到环境变量:确实fishshell是这样设置环境变量的吗?vim/etc/profile加入以下内容:e......
  • 索引失效原因有哪些?
    索引失效通常指的是数据库查询无法有效利用索引,从而导致查询性能下降。1. 模糊查询的前导通配符:当使用模糊查询(如LIKE‘%abc’)时,索引失效,因为通配符在前面会导致索引无法使用。2.  未使用索引字段进行过滤:如果查询条件没有使用到创建的索引字段,数据库可能不会使用该索......
  • 可变数据类型与不可变数据类型区别?哪些是可变?哪些不可变?
    可变数据类型:对该数据类型值做修改(增删改查),若它对应的内存地址没有发生变化,那么这种类型的数据就称为可变数据类型。若对变量进行重新赋值,那么变量的内存地址会发生变化。不可变数据类型:对该数据类型值做修改(增删改查),若它对应的内存地址发生变化,那么这种数据类型就称为不可变数......
  • spring Cloud 有哪些组件?
    Eureka:服务注册与发现,每个服务都向eureka提供自己的ip地址,端口号,协议,通信协议,eureka将各个服务维护到一个服务清单中(双层map,第一层key为服务名,第二层key为实例名),同时对服务维持心跳,剔除不可用的服务。发现:eurkeka注册的服务之间不用指定服务的地址,而是通过服务名向注册中心咨询,......
  • 春招来了!该在哪些方面提升面试能力?
    欢迎关注公众号(通过文章导读关注:【11来了】),及时收到AI前沿项目工具及新技术的推送发送资料可领取深入理解Redis系列文章结合电商场景讲解Redis使用场景、中间件系列笔记和编程高频电子书!文章导读地址:点击查看文章导读!感谢你的关注!春招来了!该在哪些方面提升面试能力?接下......
  • 开发一个外贸辅助工具需要了解哪些代码
    随着全球化的加速,外贸行业已成为许多国家经济增长的重要引擎,然而,在外贸业务中,企业常常面临许多挑战,如语言障碍、文化差异、法律法规等。为了帮助外贸企业更好地开展业务,开发一款外贸辅助工具显得尤为重要,那么,开发一款外贸辅助工具需要了解哪些代码呢?本文将为您详细解答。一、前端......
  • 我们公司都用哪些软件?强烈推荐这些
    大家好,我是鱼皮。周末给大家分享一些轻松的干货吧,聊聊我们公司在用的软件,说不定能帮大家提高学习工作效率呢~我把软件分为四大类:团队协作、内容创作、文件共享、效率提升,分别介绍,便于大家选取。团队协作团队协作的两个经典场景是即时通讯和文档协作。我们公司内部的即时通讯软......
  • 使用Optional更优雅地处理非空判断
    (一)引言在平常的编码之中,有一个错误总会在你的意料之外出现,那就是空指针异常。空指针的出现也很简单,你得到了一个null对象,调用了一些方法,出现空指针异常。空指针会出现在各种地方,常见的比如Map.get()没有获取到对象就调用对象例的方法,类对象没有获取到就调用类中的方法。空指针......
  • 外贸CRM系统有哪些特点和应用价值?外贸企业必看
    外贸企业在客户管理、业务管理方面有更高的追求。为了更好地发展全球业务,满足客户多元化的需求,外贸企业需要通过CRM管理系统实现智能管理。接下来,让我们来谈谈外贸CRM的概念、特点和应用。什么是外贸CRM?外贸CRM是指针对外贸行业的客户关系管理系统,它可以帮助外贸企业管理客户......
  • 聊城申请ISO认证包含了哪些内容有什么好处
    聊城申请ISO认证包含了哪些内容有什么好处恒标知产刘经理 什么是ISO?ISO是世界上最大的国际标准化组织(InternationalOrganizationforStandardization)的简称。它成立于1947年2月23日,它的前身是1928年成立的“国际标准化协会国际联合会”(简称ISA)。ISO的成员由来自世界上100多个......