亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 99 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號