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

riskers · · 1099 次点击
第一个没看出什么问题 第二个其实都相当于顺序执行了,goroutine都没啥用。 你这个情况直接加个chan缓存就可以了,同时做多个处理。
#1
更多评论
我按照第一种请求的话,出现 panic 是 `no free connections available to host`,可能是因为我用的是 fasthttp。 我换成 go 的 http 就可以了,但是有一事不解,我用第一种方法写,相当于我同时开了 8000 多个协程,我感觉可能会崩掉(因为只是在我本地使用)。怎么能方便地去控制开协程的个数呢?比如我一次只想开 100 个协程。直接 chan 缓存成 100 就行了么? 望解答
#2
法1的panic,估计是在于你的http服务端处理不了一瞬间来的上万个请求,原因在于abc.com这个网站的请求处理能力,跟你的代码关系不大,代码应该是没问题的,法二与法三的区别在于,法二相当于总共开了2个携程再跑,法三相当于开了len(gidlist)个携程再跑,但是法三若想真正意义上开了len(gidlist)个携程去跑,必须保证下面的代码,len(list)==0,只有这样才会造成你看到的时间差,如果len(list) !=0,实际上法二与法三的执行时间是差不多的 if len(list) == 0 { ch <- reqBody[0].Gid } ch <- ""
#3