golang gin框架的gorountine使用

本文探讨了Gin框架如何处理高并发请求,通过示例展示了每个request请求会在新的goroutine中处理,实现并发。同时,通过一个例子解释了sync.WaitGroup的使用,说明在多个goroutine中同步任务完成的情况。在示例中,对比了同步和异步处理请求的区别,并展示了如何在异步任务中使用WaitGroup确保所有任务执行完毕。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 request

  gin框架的每一个request请求都会开一个goroutine来处理,所以天然支持高并发

二 handle

func main() {
    r := gin.Default()

    r.GET("/long_async", func(c *gin.Context) {
        // 创建要在goroutine中使用的副本
        cCp := c.Copy()
        go func() {
            // simulate a long task with time.Sleep(). 5 seconds
            time.Sleep(5 * time.Second)

            // 这里使用你创建的副本
            log.Println("Done! in path " + cCp.Request.URL.Path)
        }()
    })

    r.GET("/long_sync", func(c *gin.Context) {
        // simulate a long task with time.Sleep(). 5 seconds
        time.Sleep(5 * time.Second)

        // 这里没有使用goroutine,所以不用使用副本
        log.Println("Done! in path " + c.Request.URL.Path)
    })

    // Listen and serve on 0.0.0.0:8080
    r.Run(":8080")
}

  浏览器分别访问http://localhost:8080/long_sync  http://localhost:8080/long_async 会发现async会立马抛出返回,而sync则是同步等待到任务结束

三 sync.WaitGroup

package main

import (
    "fmt"
    "github.com/gin-gonic/gin"
    "log"
    "sync"
    "time"
)

func main() {
    r := gin.Default()

    a := 1
    
    r.GET("/long_async", func(c *gin.Context) {
        var wg sync.WaitGroup


        // 创建要在goroutine中使用的副本
        cCp := c.Copy()
        wg.Add(1)
        go func() {
            // simulate a long task with time.Sleep(). 5 seconds
            time.Sleep(5 * time.Second)

            // 这里使用你创建的副本
            log.Println("Done! in path " + cCp.Request.URL.Path)
            wg.Done()
        }()
        wg.Add(1)
        go func() {
            // simulate a long task with time.Sleep(). 5 seconds
            time.Sleep(5 * time.Second)

            // 这里使用你创建的副本
            log.Println("Done2! in path " + cCp.Request.URL.Path)
            wg.Done()
        }()
        wg.Add(1)
        go func() {
            // simulate a long task with time.Sleep(). 5 seconds
            time.Sleep(2 * time.Second)

            log.Println("a1", a )
            a = 2
            log.Println("a11", a )
            // 这里使用你创建的副本
            log.Println("Done3! in path " )
            wg.Done()
        }()
        wg.Add(1)
        go func() {
            // simulate a long task with time.Sleep(). 5 seconds
            time.Sleep(5 * time.Second)
            log.Println("a2", a )
            // 这里使用你创建的副本
            log.Println("Done2! in path " + c.Request.URL.Path)
            wg.Done()
        }()

        wg.Wait()
        fmt.Println("request done")
    })

    r.GET("/long_sync", func(c *gin.Context) {
        // simulate a long task with time.Sleep(). 5 seconds
        time.Sleep(5 * time.Second)

        // 这里没有使用goroutine,所以不用使用副本
        log.Println("Done! in path " + c.Request.URL.Path)
    })

    // Listen and serve on 0.0.0.0:8080
    r.Run(":8080")
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值