高并发下Go`net / http`的一些混淆

时间:2018-05-10 06:46:27

标签: go logging gin

高并发下的一些混淆。

我使用wrk来测试Gin,有不确定性。杜松子酒似乎并不安全。

  package main

  import (
    "fmt"
    "sync/atomic"

    "github.com/gin-gonic/gin"
  )

  var count int64 = 0

  func Test(c *gin.Context) {
    atomic.AddInt64(&count, 1)
    fmt.Println(count)
    c.String(200, "success")
  }

  func main() {
    gin.SetMode(gin.DebugMode)
    router := gin.New()
    router.GET("test", Test)
    router.Run(":8080")
  }

测试shell代码

  wrk -t50 -c50 -d 1s http://localhost:8080/test

杜松子酒输出重复数据

duplicate data

======== ========更新

即使打印代码是这样的。

  countCopy := count
  go func() {
    fmt.Println(countCopy)
  }()

我也使用ab测试它,同样的问题。

======== ========更新

与net / http相同,仍有重复数据。

  package main

  import (
    "fmt"
    "net/http"
    "sync/atomic"
  )

  var count int64 = 0

  func Test(w http.ResponseWriter, req *http.Request) {
    atomic.AddInt64(&count, 1)
    fmt.Println(count)
    w.Write([]byte("success"))
  }

  func main() {
    http.HandleFunc("/test", Test)
    http.ListenAndServe(":8080", nil)

  }

data

我尝试使用log package,这对并发goroutine是安全的。同样的。

log.Println(countCopy)

1 个答案:

答案 0 :(得分:6)

您必须使用count中返回的值,因为func Test(c *gin.Context) { current := atomic.AddInt64(&count, 1) fmt.Println(current) c.String(200, "success") } 可以在您有机会打印之前更改:

new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(By.id("submitID"))).click();