日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

golang gin框架的gorountine使用

發(fā)布時(shí)間:2023/12/13 综合教程 30 生活家
生活随笔 收集整理的這篇文章主要介紹了 golang gin框架的gorountine使用 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一 request

  gin框架的每一個(gè)request請(qǐng)求都會(huì)開(kāi)一個(gè)goroutine來(lái)處理,所以天然支持高并發(fā)

二 handle

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

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

            // 這里使用你創(chuàng)建的副本
            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)

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

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

  瀏覽器分別訪問(wèn)http://localhost:8080/long_synchttp://localhost:8080/long_async 會(huì)發(fā)現(xiàn)async會(huì)立馬拋出返回,而sync則是同步等待到任務(wù)結(jié)束

三 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


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

            // 這里使用你創(chuàng)建的副本
            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)

            // 這里使用你創(chuàng)建的副本
            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 )
            // 這里使用你創(chuàng)建的副本
            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 )
            // 這里使用你創(chuàng)建的副本
            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)

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

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

總結(jié)

以上是生活随笔為你收集整理的golang gin框架的gorountine使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。