zu1k / nali

An offline tool for querying IP geographic information and CDN provider. 一个查询IP地理信息和CDN服务提供商的离线终端工具.
https://github.com/zu1k/nali
MIT License
3.75k stars 340 forks source link

fix concurrent map write #125

Closed lhcn closed 2 years ago

lhcn commented 2 years ago

写了个webAPI发现并发大的时候会遇到 concurrent map writes。 可以用 sync.Map 或者sync.Mutex + map处理。 PR采用了前者,目前运行良好。

fatal error: concurrent map writes
goroutine 18613 [running]:
runtime.throw({0x77d5d8?, 0x5?})
        /tmp/go/src/runtime/panic.go:992 +0x71 fp=0xc0002b37d8 sp=0xc0002b37a8 pc=0x433411
runtime.mapassign_faststr(0xc0002dd4d0?, 0xc0002dc919?, {0xc0002dc919, 0xd})
        /tmp/go/src/runtime/map_faststr.go:212 +0x39c fp=0xc0002b3840 sp=0xc0002b37d8 pc=0x41297c
github.com/zu1k/nali/internal/db.Find(0x809408?, {0xc0002dc919, 0xd})
        /tmp/go/pkg/mod/github.com/zu1k/nali@v0.5.0/internal/db/db.go:81 +0xc9 fp=0xc0002b3898 sp=0xc0002b3840 pc=0x6e29c9
github.com/zu1k/nali/pkg/entity.ParseLine({0xc0002dc919, 0xd})
        /tmp/go/pkg/mod/github.com/zu1k/nali@v0.5.0/pkg/entity/parse.go:58 +0x39f fp=0xc0002b39f0 sp=0xc0002b3898 pc=0x6e429f
main.parseIp({0x809318, 0xc0004880e0}, 0x0?)
package main

import (
    "flag"
    "net/http"
    "os"

    "github.com/zu1k/nali/pkg/entity"
)

// https://github.com/zu1k/nali
func parseIp(w http.ResponseWriter, req *http.Request) {
    query := req.URL.Query()
    ip := query.Get("ip")
    res := entity.ParseLine(ip)
    w.Write([]byte(res.String()))
}

func main() {
    port := flag.String("p", "8004", "port")
    flag.Parse()
    cd, _ := os.Getwd()
    // fmt.Println(cd)
    // naliHome := path.Join(cd, ".nali")
    os.Setenv("NALI_HOME", cd)
    http.HandleFunc("/goapi/nali/parse", parseIp)
    http.ListenAndServe(":"+*port, nil)
    // entity.ParseLine("1.1.1.1")

}
zu1k commented 2 years ago

看起来没有问题,感谢。因为是做 cli 就没有考虑并发