我一直试图解决这个问题很长一段时间我真的无法看到原因.. 问题是我正在调用goroutine n次,这必须在通道中留下一些结果。此goroutines通过客户端向某个网站发送帖子请求。事情是看起来他们必须等待彼此,因为他们的时间(功能完成的时间)在输出中看起来像这样: 1秒 2S 3S 5S 。
等等;当他们应该同时运行时。
这里是代码的重要部分。
首先是调用函数。这应该触发" getFlight"对于每个id,并继续收集他们通过频道返回的信息。 postUrl和urlParams分别是预先指定的变量,字符串和指针。客户端的副本只是因为我认为使用相同的客户端可能是序列化的原因,但看起来不是。
result := []types.Trip{}
c := make(chan types.Trip)
for _, id := range ids {
client1 := *client
client2 := &client1
go getFlight(id, postUrl, urlParams, client2, c)
}
for range ids {
result = append(result, <-c)
}
return result
这是我发出http请求的getFlight的一部分。所有变量都已预先初始化。
func getFlight(id string, postUrl string, urlParams *url.Values, client*http.Client, c chan types.Trip)
var newTrip types.Trip
newTrip.Url = postUrl
newTrip.UrlParams = *urlParams
r, err := http.NewRequest("POST", myUrl, bytes.NewBufferString(form.Encode()))
r.Header.Add("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
resp, err := client.Do(r)
if err != nil {
return
}
body, _ := ioutil.ReadAll(resp.Body)
resp.Body.Close()
正如我所说,每个线程的getFlight时间输出如下所示:
4.6196584s 5.8934936s 7.1387969s 8.3415495s 9.7005444s 11.078563s 12.1587691s 13.8861763s
没有任何并发性,我真的不知道为什么......所有的功能都是在同一时间开始的,只需将一个Println放在getFlight的初始阶段,所有在同一时间显示的地方。
感谢您的帮助。
编辑:问题确实是在调用client.Do(r)时,我把定时器放在通话前后,我得到相同的时间(1s,2s,3s,5s ..),因此有地方线程正在等待前一个线程完成。问题是,为什么?