去http服务器和全局变量

时间:2013-09-20 18:06:04

标签: go

我有一个http服务器。它是用Go编写的。 我有这段代码:

package main
import (
    "net/http"
    "runtime"
)
var cur = 0
func handler(w http.ResponseWriter, r *http.Request) {
    cur = cur + 1;
}
func main() {
    runtime.GOMAXPROCS(runtime.NumCPU())
    http.HandleFunc("/", handler)
    http.ListenAndServe(":9010", nil)
}

安全吗? 可能我需要使用互斥锁吗?

2 个答案:

答案 0 :(得分:4)

不,它不安全,是的,你需要锁定某种形式。 每个连接都在自己的goroutine中处理。有关详细信息,请参阅the Serve() implementation

一般模式是使用goroutine来检查频道并接受更改 通过渠道:

var counterInput = make(chan int)

func handler(w http.ResponseWriter, r *http.Request) {
    counterInput <- 1
}

func counter(c <- chan int) {
    cur := 0
    for v := range c {
        cur += v
    }
}

func main() {
    go counter(counterInput)
    // setup http
}

相关:Is "net/http"'s use of global variables considered a good practice in golang?

答案 1 :(得分:1)

除非我忽略了某些内容,否则在这种情况下,您可以使用sync/atomic包中的the tools来代替使用锁(或频道)(尽管您需要制作)您的类型为int32int64

尽管如此,文档本身也会推荐你。

  

这些功能需要非常小心才能正确使用。除了特殊的低级应用程序,最好使用通道或同步包的功能来实现同步。通过沟通分享记忆;不要通过共享记忆来沟通。