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

     

  • 相关阅读:
    计算相邻字段 四至
    eclipse+terminal
    10 行 Python 代码实现模糊查询/智能提示
    Sublime Text 3,有了Anaconda就会如虎添翼
    Visual Studio上开发Python六大功能
    11 Python Libraries You Might Not Know
    linux安装PyCharm,PyCharm常用快捷键及调试模式,pycharm里面对文件夹或者文件进行重命名
    mysql mac客户端: sequel,mysql-workbench
    ImageMagick convert多张照片JPG转成pdf格式,pdfunite合并PDF文件
    互联网金融ABS为何遭遇急刹车?
  • 原文地址:https://www.cnblogs.com/bushuwei/p/15137331.html
Copyright © 2020-2023  润新知