工作池并发写入map的结果不对,开启10个goroutine正常,10个以上就结果混乱了,请教各位大佬哪里有问题?

tang_2020 · · 912 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

` code func GetProvinceData(strtime string, cidlist []string) (map[string]int64, int64) { //var ProvinceMap = map[string]int64{ // "北京市": 0, // "上海市": 0, // "天津市": 0, // "重庆市": 0, // "河北省": 0, // "河南省": 0, // "山东省": 0, // "山西省": 0, // "湖南省": 0, // "湖北省": 0, // "辽宁省": 0, // "黑龙江省": 0, // "吉林省": 0, // "江苏省": 0, // "浙江省": 0, // "安徽省": 0, // "福建省": 0, // "江西省": 0, // "云南省": 0, // "广东省": 0, // "四川省": 0, // "贵州省": 0, // "陕西省": 0, // "甘肃省": 0, // "青海省": 0, // "海南省": 0, // "台湾省": 0, // "内蒙古自治区": 0, // "广西壮族自治区": 0, // "宁夏回族自治区": 0, // "新疆维吾尔自治区": 0, // "西藏自治区": 0, // "香港特别行政区": 0, // "澳门特别行政区": 0, // "其他": 0, //} var ProvinceMap = map[string]int64{} // 查询数据库的 IP 结果集 ipList,sum := ActiveGetIP(strtime, cidlist) t1:= time.Now().Unix() jobs:=make(chan string) hand :=make(chan int) //isWork :=make(chan bool) var lock sync.Mutex for w:=1;w<=10;w++{ go func(w int,jobs <-chan string,hand chan <-int){ //isWork chan<- bool for ips:=range jobs{ //isWork <-true provinceName := FromIPGetAddress(ips) // 通过ip获取省份名称,上海市/河南省 lock.Lock() ProvinceMap[provinceName] += 1 lock.Unlock() } hand <-w }(w,jobs,hand) } for _, data := range ipList { jobs <- data.Ip //<-isWork } close(jobs) for a:=1;a<=10;a++{ <- hand } fmt.Println("消耗时间====:",time.Now().Unix()-t1) return ProvinceMap, sum } `

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

912 次点击  
加入收藏 微博
2 回复  |  直到 2020-02-04 18:27:23
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传