致命错误:并发映射读取和映射写入

时间:2018-03-26 06:13:43

标签: go

fatal error: concurrent map read and map write

goroutine 5065809 [running]:
runtime.throw(0x6b4281, 0x21)
        /usr/local/go/src/runtime/panic.go:566 +0x95 fp=0xc420c05670 
sp=0xc420c05650
runtime.mapaccess1_faststr(0x65ea20, 0xc420015020, 0xc42178ea8e, 0x16, 
0x0)
        /usr/local/go/src/runtime/hashmap_fast.go:201 +0x4f3 
fp=0xc420c056d0 sp=0xc420c05670
collider.(*Collider).httpHandler(0xc420013120, 0x7c4dc0, 0xc4209dcdd0, 
0xc420a954a0)
        /home/ec2-user/goWorkspace/src/collider/collider.go:176 +0x7dd 
fp=0xc420c05c48 sp=0xc420c056d0

,代码是

    query := r.URL.Query()
    if(query["q"] == nil){
        c.httpError("must have a question",w)
        return
    }
    m := query["q"][0]       //this is line 176

它每天发生一次,发生后整个http服务器都关闭了。我不知道http是否在地图中做了一些并发写入。 怎么解决这个问题?

1 个答案:

答案 0 :(得分:0)

您可能正在为地图使用全局变量。每个请求都可以访问全局变量。运气不好,两个请求尝试同时访问同一个地图,因此您的错误。

最简单的解决方法是使用包Map中的sync。但根据您的使用案例,这可能更像是一种解决方法。但这会减慢您的计划速度。

另一种方法是在处理程序中定义地图,如果你只需要它。

如果您可以发布更多文件,那么更容易给出更好的答案。