【问题标题】:Panic in Golang http.Client with high concurrent excecutions高并发执行的 Golang http.Client 出现恐慌
【发布时间】: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


【解决方案1】:

我将把钱用于因调用Close() 而导致的恐慌而不是resp.Body

始终检查您的错误!

一般来说,如果一个函数返回一个值和一个错误,在非零错误的情况下响应值可能无法使用。对此的任何例外都应有据可查。

【讨论】:

  • 是的,我发现错误是由 Close() 在延迟函数中的 resp.Body 上产生的。:恐慌:运行时错误:无效的内存地址或 nil 指针取消引用 [信号 0xb 代码 = 0x1地址=0x40 电脑=0x3295]
  • @Fersca:不要那样做。如果出现错误,则响应无效,因此即使 resp != nilBody(或其他属性)仍可能包含 nil 指针。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-28
  • 1970-01-01
  • 2021-07-11
  • 1970-01-01
  • 2014-09-21
  • 2014-10-10
  • 2020-10-23
相关资源
最近更新 更多