golang gin框架的gorountine使用

一 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")
}

 

原文地址:https://www.cnblogs.com/bushuwei/p/15137331.html