zoukankan      html  css  js  c++  java
  • 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")
    }

     

  • 相关阅读:
    Node.js理解
    PayPal为什么从Java迁移到Node.js
    移动开发技巧总结
    Flex性能调优相关的一些总结
    Flex组件的生命周期
    Adobe Flash Builder 4.7 新功能详解
    【Django】Cookie
    【Django】路由系统
    【Django】视图系统
    【Django】ORM操作#2
  • 原文地址:https://www.cnblogs.com/bushuwei/p/15137331.html
Copyright © 2011-2022 走看看