net/http 和 ant 每次运行都会给我不同的结果

我编写了一个代码来区分给出 200 个响应的域和那些没有响应的域。虽然我有 3447 个不同的域,但每次运行程序后我都会得到不同的结果。

我找到域的来源:https ://github.com/opendns/public-domain-lists/blob/master/opendns-random-domains.txt

wc -l example.txt 3447

package main


import (

    "bufio"

    "log"

    "net/http"

    "os"

    "sync"

    "time"


    "github.com/panjf2000/ants"

)


var sitelist []string


func check(pool interface{}) {

    address := pool.(string)

    client := &http.Client{}

    client.Timeout = time.Second * 5

    req, _ := http.NewRequest("GET", "http://"+address, nil)


    if response, err := client.Do(req); err == nil {

        status := response.StatusCode

        if status == 200 {

            // log.Println("Works:", address)

            sitelist = append(sitelist, "works:"+address)

            return

        }


        // log.Println("Not working:", address)

        sitelist = append(sitelist, "not-works:"+address)


    } else {

        // log.Println("Not working:", address)

        sitelist = append(sitelist, "not-works:"+address)


    }


}


func main() {


    defer ants.Release()


    var wg sync.WaitGroup

    p, _ := ants.NewPoolWithFunc(1000, func(i interface{}) {

        check(i)

        wg.Done()

    })

    defer p.Release()


    file, err := os.Open("example.txt")

    if err != nil {

        log.Fatal(err)

    }

    defer file.Close()


    scanner := bufio.NewScanner(file)

    for scanner.Scan() {

        wg.Add(1)

        a := scanner.Text()

        _ = p.Invoke(string(a))

    }


    wg.Wait()


    log.Println(len(sitelist))

}


go run ./main.go


3385


go run ./main.go


3338


go run ./main.go


3300


这是example.txt


我不明白我做错了什么。谢谢你


米琪卡哇伊
浏览 78回答 1
1回答

富国沪深

根据给出的答案,我了解到存在数据竞争案例。我用带有sync.Mutex的外部函数解决了它package mainimport (    "bufio"    "fmt"    "log"    "net/http"    "os"    "sync"    "time"    "github.com/panjf2000/ants")var (    sitelist = make(map[string]int8))var wg sync.WaitGroupvar m sync.Mutexfunc add(address string, status int8, m *sync.Mutex) {    m.Lock()    sitelist[address] = status    m.Unlock()}func check(pool interface{}) {    address := pool.(string)    client := &http.Client{}    client.Timeout = time.Second * 45    req, _ := http.NewRequest("GET", "http://"+address, nil)    if response, err := client.Do(req); err == nil {        status := response.StatusCode        if status == 200 {            add(address, 1, &m)        } else {            add(address, 0, &m)        }    } else {        add(address, 0, &m)    }}func main() {    defer ants.Release()    p, _ := ants.NewPoolWithFunc(1000, func(i interface{}) {        check(i)        wg.Done()    })    defer p.Release()    file, err := os.Open("example.txt")    if err != nil {        log.Fatal(err)    }    defer file.Close()    scanner := bufio.NewScanner(file)    for scanner.Scan() {        a := scanner.Text()        wg.Add(1)        _ = p.Invoke(string(a))    }    wg.Wait()    fmt.Println(len(sitelist))}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go