为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
米琪卡哇伊 2022-10-10 18:54:25
我编写了一个代码来区分给出 200 个响应的域和那些没有响应的域。虽然我有 3447 个不同的域,但每次运行程序后我都会得到不同的结果。我找到域的来源:https ://github.com/opendns/public-domain-lists/blob/master/opendns-random-domains.txtwc -l example.txt 3447package mainimport (    "bufio"    "log"    "net/http"    "os"    "sync"    "time"    "github.com/panjf2000/ants")var sitelist []stringfunc 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.go3385go run ./main.go3338go run ./main.go3300这是example.txt我不明白我做错了什么。谢谢你
查看完整描述

1 回答

?
富国沪深

TA贡献1790条经验 获得超9个赞

根据给出的答案,我了解到存在数据竞争案例。


我用带有sync.Mutex的外部函数解决了它


package main


import (

    "bufio"

    "fmt"

    "log"

    "net/http"

    "os"

    "sync"

    "time"


    "github.com/panjf2000/ants"

)


var (

    sitelist = make(map[string]int8)

)


var wg sync.WaitGroup

var m sync.Mutex


func 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))


}


查看完整回答
反对 回复 2022-10-10
  • 1 回答
  • 0 关注
  • 77 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信