当前位置: 首页 > 工具软件 > Iris-Go > 使用案例 >

Golang - [Iris] 优雅的关闭应用程序示例

曾明诚
2023-12-01

以Iris框架为例

package main

import (
	stdCtx "context"
	"github.com/kataras/iris"
	"github.com/kataras/iris/context"
	"github.com/kataras/iris/middleware/logger"
	"github.com/kataras/iris/middleware/recover"
	"sync"
	"time"
)

func main() {
	app := iris.New()

	app.Use(recover.New())
	app.Use(logger.New())

	// 优雅的关闭程序
	serverWG := new(sync.WaitGroup)
	defer serverWG.Wait()

	iris.RegisterOnInterrupt(func() {
		serverWG.Add(1)
		defer serverWG.Done()

		ctx, cancel := stdCtx.WithTimeout(stdCtx.Background(), 20 * time.Second)
		defer cancel()

		// 关闭所有主机
		app.Shutdown(ctx)
	})
	
	app.Get("/", func(ctx context.Context) {
		ctx.JSON(iris.Map{"code": 1000, "data": "Welcome"})
	})

	app.Get("/hello", func(ctx context.Context) {
		ctx.JSON(iris.Map{"code": 1000, "data": "Hello Iris"})
	})

	app.Run(iris.Addr(":8080"), iris.WithoutInterruptHandler)
}

说明:主要是借助了sync.WaitGroup的功能,来阻塞程序,防止app退出以后,ctx直接被销毁。一旦ctx被销毁,容易导致正在执行的任务没有执行完成。

 类似资料: