【发布时间】:2014-08-06 04:01:05
【问题描述】:
我正在创建一个系统,它是 golang 中的一个 http 服务器,它将根据到达它的每个请求对另一个 API 执行多个请求。
例如
curl localhost:8080/users?ids=1,2,3,4
将执行多个并发获取:
api.com/user/1
api.com/user/2
api.com/user/3
api.com/user/4
我遇到了一个问题,当它有大量并发请求时,http.Client 让我感到恐慌(如果我点击 localhost:8080/users?ids=1,2,3,4 ..... 40 与 AB 与 4 并发,或在我的浏览器中刷新)
程序似乎与句子有关(第 159 行)
resp, _ := client.Do(req)
我的代码在这里(不是那么大...... 180 行): http://play.golang.org/p/olibNz2n1Z
恐慌错误是这个:
goroutine 5 [select]:
net/http.(*persistConn).roundTrip(0xc210058f80, 0xc21000a720, 0xc210058f80, 0x0, 0x0)
/usr/local/go/src/pkg/net/http/transport.go:879 +0x6d6
net/http.(*Transport).RoundTrip(0xc210058280, 0xc21005b1a0, 0x1, 0x0, 0x0)
/usr/local/go/src/pkg/net/http/transport.go:187 +0x391
net/http.send(0xc21005b1a0, 0x590290, 0xc210058280, 0x0, 0x0, ...)
/usr/local/go/src/pkg/net/http/client.go:168 +0x37f
net/http.(*Client).send(0xc21001e960, 0xc21005b1a0, 0x28, 0xc21001ec30, 0xc21005f570)
/usr/local/go/src/pkg/net/http/client.go:100 +0xd9
net/http.(*Client).doFollowingRedirects(0xc21001e960, 0xc21005b1a0, 0x2ab298, 0x0, 0x0, ...)
/usr/local/go/src/pkg/net/http/client.go:294 +0x671
net/http.(*Client).Do(0xc21001e960, 0xc21005b1a0, 0xa, 0x0, 0x0)
/usr/local/go/src/pkg/net/http/client.go:129 +0x8f
main.buscarRecurso(0xc21000a650, 0xb, 0xc2100526c0)
/Users/fscasserra/Documents/workspace/Luna/multiget-api/multiget.go:159 +0x131
created by main.obtenerRecursos
/Users/fscasserra/Documents/workspace/Luna/multiget-api/multiget.go:106 +0x197
谁能帮帮我?
最好的问候, 费
【问题讨论】:
-
在状态为
running的 goroutine 中发生恐慌。状态为select的人只是睡觉。 -
...它不是从恐慌中抛出的? ...
-
你已经展示了 goroutine 5 的堆栈是什么样的。那么所有其他的 goroutine 呢?你确定 goroutine 5 是恐慌的那个吗?
-
对于初学者:检查 http.NewRequest 和 client.Do 返回的错误。您的应用程序会忽略它们并继续。
-
检查所有其他错误。您也忽略了 ioutil.ReadAll。 (并且编写“正常”的 godoc cmets 会使阅读您的代码更愉快:-)
标签: multithreading concurrency go