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是否在地图中做了一些并发写入。 怎么解决这个问题?
答案 0 :(得分:0)
您可能正在为地图使用全局变量。每个请求都可以访问全局变量。运气不好,两个请求尝试同时访问同一个地图,因此您的错误。
最简单的解决方法是使用包Map
中的sync
。但根据您的使用案例,这可能更像是一种解决方法。但这会减慢您的计划速度。
另一种方法是在处理程序中定义地图,如果你只需要它。
如果您可以发布更多文件,那么更容易给出更好的答案。