关于gorutine

做一个爬虫,然后对每个url开一个gorutine去解析,结果返回后,gorutine的数量却不会下降回原来的数量。 爬使用的是原生的http包中的get方法。

共 7 个回复


jimmykuu

提供点代码呢

# 0

zweite

``` package main

import( "runtime" "fmt" "sync" "net/http" )

func main() { fmt.Println(runtime.NumGoroutine()) waitGroup := sync.WaitGroup{} for i := 0; i < 100; i++ { waitGroup.Add(1) go func(i int, wait *sync.WaitGroup) { defer func(){ wait.Done() }() Println(i) }(i, &waitGroup) } waitGroup.Wait() fmt.Println(runtime.NumGoroutine()) }

func Println(i int) { //println(i) client := http.Client{} , = client.Get("http://www.baidu.com") } ```

# 1

zweite

这~~~不支持markdown的么

# 2

jimmykuu

支持,你写的有问题吧,看看markdown语法吧

# 3

yufeng

package main

import (
    "fmt"
    "net/http"
    "runtime"
    "sync"
)

func main() {
    fmt.Println(runtime.NumGoroutine())
    waitGroup := sync.WaitGroup{}
    for i := 0; i < 100; i++ {
        waitGroup.Add(1)
        go func(i int, wait *sync.WaitGroup) {
            defer func() {
                wait.Done()
            }()
            Println(i)
        }(i, &waitGroup)
    }
    waitGroup.Wait()
    fmt.Println(runtime.NumGoroutine())
}

func Println(i int) {
    println(i)
    client := http.Client{}
    _, _ = client.Get("http://www.baidu.com")
}

我格式化了一下,看得明白点,下次能不能贴好看点啊

# 4

jimmykuu

client.Get的resp需要关闭Body,不然不会释放

resp, err := client.Get("http://www.baidu.com")
if err != nil {
    return
}
defer resp.Body.Close()
# 5

zweite

好的,谢谢你们哈,真的是忘了Close了

# 6