之前一直采用的是shell里的wget或curl获取返回码的操作,由于效率较低,于是计划利用go的多线程优势写这样一个小工具。经过简单的验证,效率较单线程提升比较明显,唯一很难保证的一点是多线程的状态下会不会导致访问网页出现失败,从而使本来是200的页面返回非200的状态码,这一点有待解决。
代码如下:
package mainimport (
"bufio"
"fmt"
"net/http"
"os"
"runtime"
"strings"
"sync"
)var urlChan chan string
var wg sync.WaitGroupfunc main() {
maxProcs := runtime.NumCPU()
runtime.GOMAXPROCS(maxProcs)fmt.Println("start read")
urlChan = make(chan string, 5000)
file, err := os.Open("C:\\Users\\chant\\Desktop\\addNewUrl")
if err != nil {
fmt.Println(err)
}
defer file.Close()
scanner := bufio.NewScanner(file)for scanner.Scan() {
urlChan <- scanner.Text()
}
for i := 0;
i < 10;
i++ {
wg.Add(1)
go fetchUrl()
}
wg.Wait()
fmt.Println("DONE")
}func fetchUrl() {
for {
if len(urlChan) <= 0 {
break
}
url := <-urlChancodeArr := make([]int, 0, 10)
response, err := http.Get(url)
if err != nil {
fmt.Println("%s%s", url, err)
return
}defer response.Body.Close()
for {
if response == nil {
break
}
code := response.StatusCode
req := response.Request
if req != nil {
if strings.Contains(req.URL.Path, "error.htm") {
code = 404
}
}
codeArr = append(codeArr, code)
response = response.Request.Response
}
size := len(codeArr)
var result string
for i := size - 1;
i >= 0;
i-- {
result = fmt.Sprintf("%s%d", result, codeArr[i])
}
fmt.Println(url, result)
}
wg.Done()
}
【go 多线程获取url返回码】
推荐阅读
- Go|Docker后端部署详解(Go+Nginx)
- GO|GO,GO,GO!
- Go成长之路|go中判断空字符串、nil和len(t)的用法
- go编译tools
- go grpc安装与使用
- goroutine 调度原理
- Go|Go进阶之路——复杂类型
- Go进阶之路——变量
- Go进阶之路——流程控制语句