2017-10-11 65 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