doumengmian1180 2016-02-01 10:40
浏览 102
已采纳

调用http.Get时出现golang恐慌

error message:

goroutine 11357 [runnable]:
net.runtime_pollWait(0x1737f28, 0x77, 0x4fa90)
    /usr/local/go/src/runtime/netpoll.go:157 +0x60
net.(*pollDesc).Wait(0xc829571bf0, 0x77, 0x0, 0x0)
    /usr/local/go/src/net/fd_poll_runtime.go:73 +0x3a
net.(*pollDesc).WaitWrite(0xc829571bf0, 0x0, 0x0)
    /usr/local/go/src/net/fd_poll_runtime.go:82 +0x36
net.(*netFD).connect(0xc829571b90, 0x0, 0x0, 0x1714f80, 0xc829572f20, 0xece412272, 0x33aa2325, 0x473ea0, 0x0, 0x0)
    /usr/local/go/src/net/fd_unix.go:114 +0x1f6
net.(*netFD).dial(0xc829571b90, 0x1714f38, 0x0, 0x1714f38, 0xc8295755c0, 0xece412272, 0x33aa2325, 0x473ea0, 0x0, 0x0)
    /usr/local/go/src/net/sock_posix.go:137 +0x351
net.socket(0x3050e8, 0x3, 0x2, 0x1, 0x0, 0xc829575500, 0x1714f38, 0x0, 0x1714f38, 0xc8295755c0, ...)
    /usr/local/go/src/net/sock_posix.go:89 +0x411
net.internetSocket(0x3050e8, 0x3, 0x1714f38, 0x0, 0x1714f38, 0xc8295755c0, 0xece412272, 0xc833aa2325, 0x473ea0, 0x1, ...)
    /usr/local/go/src/net/ipsock_posix.go:160 +0x141
net.dialTCP(0x3050e8, 0x3, 0x0, 0xc8295755c0, 0xece412272, 0xc833aa2325, 0x473ea0, 0x2, 0x0, 0x0)
    /usr/local/go/src/net/tcpsock_posix.go:171 +0x11e
net.dialSingle(0xc829580b80, 0x1714ea8, 0xc8295755c0, 0xece412272, 0x33aa2325, 0x473ea0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/dial.go:364 +0x3f5
net.dialSerial.func1(0xece412272, 0x33aa2325, 0x473ea0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/dial.go:336 +0x75
net.dial(0x3050e8, 0x3, 0x1714ea8, 0xc8295755c0, 0xc8232f96e8, 0xece412272, 0x33aa2325, 0x473ea0, 0x0, 0x0, ...)
    /usr/local/go/src/net/fd_unix.go:40 +0x60
net.dialSerial(0xc829580b80, 0xc829572f00, 0x2, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/dial.go:338 +0x760
net.(*Dialer).Dial(0xc8200783c0, 0x3050e8, 0x3, 0xc823166ed0, 0x10, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/dial.go:232 +0x50f
net.(*Dialer).Dial-fm(0x3050e8, 0x3, 0xc823166ed0, 0x10, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/http/transport.go:38 +0x6e
net/http.(*Transport).dial(0xc820092090, 0x3050e8, 0x3, 0xc823166ed0, 0x10, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/http/transport.go:499 +0x79
net/http.(*Transport).dialConn(0xc820092090, 0x0, 0x7fff5fbff92a, 0x4, 0xc823166ed0, 0x10, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/http/transport.go:596 +0x19a9
net/http.(*Transport).getConn.func4(0xc820092090, 0x0, 0x7fff5fbff92a, 0x4, 0xc823166ed0, 0x10, 0xc8232a9560)
    /usr/local/go/src/net/http/transport.go:549 +0x66
created by net/http.(*Transport).getConn
    /usr/local/go/src/net/http/transport.go:551 +0x265

source

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
    "os"
    "strconv"
    "time"
)

func golanggo(url string, round int, c chan int64) {
    for i := 0; i < round; i++ {
        call(url, c)
    }
}

func call(url string, c chan int64) {
    eslap := int64(0)
    defer func() {
        c <- eslap
        //fmt.Println("put", eslap)
        // if err := recover(); err != nil {
        //  fmt.Println(err)
        // }
    }()
    now := time.Now()
    resp, err := http.Get(url)
    defer resp.Body.Close()
    if err != nil {
        fmt.Println("err:", err)
        return
    }
    if resp.StatusCode == 200 {
        ioutil.ReadAll(resp.Body)
        //fmt.Println(string(data[:]))
    }
    eslap = time.Now().Sub(now).Nanoseconds()
}

func main() {
    url := os.Args[1]
    size, _ := strconv.Atoi(os.Args[2])
    round, _ := strconv.Atoi(os.Args[3])
    c := make(chan int64)

    for i := 0; i < size; i++ {
        go golanggo(url, round, c)
    }

    var total int64 = 0

    var nanos int64
    for i := 0; i < (size * round); i++ {
        //fmt.Print(i)
        nanos = <-c
        //fmt.Println(i, "get", nanos)
        total += nanos
    }

    fmt.Println(total / 1000000)
}

when exec go run client.go http://www.baidu.com 10000 1, and after a few seconds program crash. when exec go run client.go http://www.baidu.com 100 1, it's ok.

How much of goroutine will cause this error?

Please help me! Thanks.

  • 写回答

2条回答 默认 最新

  • dsvf46980 2016-02-01 11:12
    关注
    resp, err := http.Get(url)
    defer resp.Body.Close()
    if err != nil {
        fmt.Println("err:", err)
        return
    }
    

    If err!= nil, then resp==nil, so crash with nil pointer dereference. Fix ur code with:

    resp, err := http.Get(url)
    if err != nil {
        fmt.Println("err:", err)
        return
    }
    defer resp.Body.Close()
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)