2017-10-11 63 views
-1

我写一段代码来记录的请求的NUM。golang sync/atomic包?

package main 

import (
    "log" 
    "net/http" 
    "runtime" 
    "sync/atomic" 
) 

var count int32 = 0 

func test(w http.ResponseWriter, r *http.Request) { 
    count = atomic.LoadInt32(&count) 
    atomic.AddInt32(&count, 1) 
    log.Println("count:", count) 
} 
func main() { 
    runtime.GOMAXPROCS(runtime.NumCPU() - 1) 
    http.HandleFunc("/", test) 
    http.ListenAndServe(":8080", nil) 
} 

我考虑过并发的条件,所以我使用原子派克。 我通过Apache的AB工具

ab -c 400 -n 1000 http://localhost:8080/ 

的结果是正确的测试代码: result 不过,有人说,他得到了他的计算机上的1004或者其他号码,我已经测试的代码很多次,但结果在我的电脑上是正确的,我的方式有错吗? 我是新来的,提前致谢。

+2

您正确使用包;你不应该直接分配/访问'count'变量,就像你使用'count = ...'。 –

+0

请显示您使用的实际代码。这个例子是不是原子的有效使用,因为日志行直接访问'count'价值,你的结果分配回'count' – JimB

+1

始终使用竞争检测器,和'vet'。 (也'ab'是测试服务器的一个很糟糕的工具,它只是HTTP/1.0和ins't即使使用存活在这里。) – JimB

回答

0

您正确使用sync/atomic包。如果你有一个原子变量,ALL阅读和写作必须使用原子功能来完成。

这里是固定的代码,以便将count变量不写入或读取非原子:

package main 

import (
    "log" 
    "net/http" 
    "runtime" 
    "sync/atomic" 
) 

var count int32 

func test(w http.ResponseWriter, r *http.Request) { 
    currentCount := atomic.LoadInt32(&count) 
    atomic.AddInt32(&count, 1) 
    log.Println("count:", currentCount) 
} 
func main() { 
    runtime.GOMAXPROCS(runtime.NumCPU() - 1) 
    http.HandleFunc("/", test) 
    http.ListenAndServe(":8080", nil) 
} 
+0

感谢,我得到了它 – salamander