高并发下的一些混淆。
我使用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
杜松子酒输出重复数据
======== ========更新
即使打印代码是这样的。
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)
}
我尝试使用log package,这对并发goroutine是安全的。同样的。
log.Println(countCopy)
答案 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();