func qidong() { gin.SetMode(gin.ReleaseMode) gin.DisableConsoleColor() router := gin.Default() //router.Use(log.Logger()) router.GET("/", SlowHandler) // 写一个服务监听 server := &http.Server{ Addr: ":8081", Handler: router, ReadTimeout: 10 * time.Second, WriteTimeout: 10 * time.Second, MaxHeaderBytes: 1 << 20, } // 启动服务 go server.ListenAndServe() // 优雅退出 gracefulExitServer(server) } 如何关闭go qidong协程
时间: 2024-03-05 18:52:32 浏览: 142
golang实战使用gin+xorm搭建go语言web框架详解.rar
你可以使用 `context` 包来关闭 `go qidong()` 协程。以下是示例代码:
```go
package main
import (
"context"
"fmt"
"net/http"
"time"
"github.com/gin-gonic/gin"
)
func qidong(ctx context.Context) error {
gin.SetMode(gin.ReleaseMode)
gin.DisableConsoleColor()
router := gin.Default()
//router.Use(log.Logger())
router.GET("/", SlowHandler)
server := &http.Server{
Addr: ":8081",
Handler: router,
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20,
}
go func() {
if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
fmt.Printf("listen: %s\n", err)
}
}()
<-ctx.Done() // 等待接收关闭信号
ctxShutDown, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer func() {
cancel()
}()
if err := server.Shutdown(ctxShutDown); err != nil {
fmt.Printf("Server Shutdown Failed:%s\n", err)
return err
}
fmt.Println("Server exiting")
return nil
}
func main() {
ctx, cancel := context.WithCancel(context.Background())
defer func() {
cancel()
}()
go qidong(ctx)
// 等待 10 秒钟,然后发送一个关闭信号给协程
time.Sleep(10 * time.Second)
fmt.Println("发送关闭信号")
cancel()
// 等待 1 秒钟,观察协程是否被正常关闭。
time.Sleep(1 * time.Second)
fmt.Println("main 函数退出")
}
func SlowHandler(c *gin.Context) {
time.Sleep(2 * time.Second)
c.JSON(http.StatusOK, gin.H{"message": "slow response"})
}
```
在上面的示例代码中,我们使用 `context` 包创建了一个 `ctx` 对象,并把它传递给 `qidong()` 协程。在协程函数中,我们使用 `select` 语句监听 `ctx.Done()` 通道,一旦收到关闭信号,就会退出协程。
在 `main()` 函数中,我们等待了 10 秒钟,然后发送一个关闭信号给协程。协程函数会在执行过程中不断地检查 `ctx.Done()` 通道,一旦收到关闭信号,就会退出协程。在 `main()` 函数中,我们等待了 1 秒钟,观察协程是否被正常关闭。在协程函数中,我们还使用了 `server.Shutdown()` 方法来关闭 HTTP 服务,以确保服务正常退出。
阅读全文