用 goroutine 写了 3 种,得到的结果都不一样,不知道为什么?

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

请教一个问题 我用 go 写了一个小脚本,批量请求快一万个请求,处理数据。用 goroutine 写了 3 种,得到的结果都不一样,不知道为什么,求教 > `FetchProductpage` 是一次 http 请求 > `gidsList` 是一个 []string,存放 id ```go func FetchProductpage(ch chan<- string) { req := &fasthttp.Request{} req.SetRequestURI("http://abc.com") req.Header.SetContentType("application/json") req.Header.SetMethod("POST") res := &fasthttp.Response{} if err := fasthttp.Do(req, res); err != nil { panic(reqBody[0].Gid + "handle error") } resBody := res.Body() var list []int json.Unmarshal(resBody, &list) if len(list) == 0 { ch <- reqBody[0].Gid } ch <- "" } ``` ```go // 法一 直接 panic ch := make(chan string) defer close(ch) for index, gid := range gidsList { go func(index int, gid string) { println("第 ", index, " 个商品:", gid) FetchProductpage(ch) }(index, gid) } for range gidsList { noGid := <-ch if noGid != "" { noGidsLen++ } } println("其中 ", noGidsLen, " 个没有结果") ``` ![1.png](https://static.studygolang.com/191117/fdd89b7985d7e3ae3e87afbddab11dbc.png) ```go // 法二 用了 10 分钟 ch := make(chan string) defer close(ch) go func() { for _, gid := range gidsList { println("第 ", index, " 个商品:", gid) FetchProductpage(ch) } }() for range gidsList { noGid := <-ch if noGid != "" { noGidsLen++ } } println("其中 ", noGidsLen, " 个没有结果") ``` ```go // 法三 只用了2分钟 ch := make(chan string) defer close(ch) for index, gid := range gidsList { go func(index int, gid string) { println("第 ", index, " 个商品:", gid) FetchProductpage(ch) }(index, gid) noGid := <-ch if noGid != "" { noGidsLen++ f.WriteString(noGid + "\n") } } println("其中 ", noGidsLen, " 个没有结果") ``` 第一种写法为什么会 panic ? 第二种和第三种的区别在哪呢?为什么时间会差这么多?

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

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

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