继上一个例子改成简单的并发,使用WaitGroup,开了100个协程但是感觉不够快,不知道为什么。。。
只要改engine.go里的就好了
package engine
import (
"fmt"
"log"
"runtime"
"sync"
"time"
"crawler0.7/fetcher"
"crawler0.7/parser"
)
func Run(seed parser.Request) { //参数是一个种子
var requests []parser.Request //新建一个队列接收种子
requests = append(requests, seed) //接收参数传来的第一个种子
runtime.GOMAXPROCS(runtime.NumCPU())
start := time.Now()
wg := sync.WaitGroup{}
count := 0
for i := 0; i < 100; i++ {
wg.Add(1)
go func() {
for len(requests) > 0 { //如果种子不位0
r := requests[0] //取第一个种子
requests = requests[1:] //截掉第一个种子
contents, err := fetcher.Fetch(r.Url) //开始爬取对应种子的页面
if err != nil {
log.Printf("Fetching %s error!", r.Url)
continue //如果获取失败就继续下一个种子
}
parserResult := r.ParserFunc(contents) //队列结构的函数提取结果
requests = append(requests, parserResult.Requests...) //这里可以获取到很多url加到队列中
for _, item := range parserResult.Items {
fmt.Printf("%s \n", item) //打印队列里的项目
}
count = count + 1
fmt.Printf("第%d个页面, 获取到%d条信息, time:%.2fs\n", count, len(parserResult.Items), time.Since(start).Seconds())
}
wg.Done()
}()
}
wg.Wait()
}