Go语言---并发版网页段子筛选爬虫

warning: 这篇文章距离上次修改已过233天,其中的内容可能已经有所变动。



package main
 
import (
    "fmt"
    "net/http"
    "sync"
    "time"
)
 
// 定义一个简单的工作池,用于限制并发
type WorkPool struct {
    Workers int
    Jobs    chan func()
    wg      sync.WaitGroup
}
 
// 初始化工作池
func NewWorkPool(workers int) *WorkPool {
    pool := &WorkPool{
        Workers: workers,
        Jobs:    make(chan func()),
    }
    pool.startWorkers()
    return pool
}
 
// 添加一个新的工作任务
func (p *WorkPool) Schedule(job func()) {
    p.wg.Add(1)
    go p.doJob(job)
}
 
// 执行工作任务
func (p *WorkPool) doJob(job func()) {
    p.Jobs <- job
}
 
// 启动工作者
func (p *WorkPool) startWorkers() {
    for i := 0; i < p.Workers; i++ {
        go func() {
            for {
                select {
                case job := <-p.Jobs:
                    job()
                    p.wg.Done()
                }
            }
        }()
    }
}
 
// 等待所有工作结束
func (p *WorkPool) Wait() {
    p.wg.Wait()
    close(p.Jobs)
}
 
// 爬取单个网页的工作
func crawlPage(url string, ch chan<- string) {
    resp, err := http.Get(url)
    if err != nil {
        ch <- ""
        return
    }
    defer resp.Body.Close()
 
    // 这里应该是解析网页内容的代码
    // ...
    ch <- "网页内容"
}
 
func main() {
    start := time.Now()
    urls := []string{"http://www.example.com/page1", "http://www.example.com/page2"} // 示例URL列表
    pool := NewWorkPool(8)                                                            // 创建一个工作池,最多8个工作者
    results := make(chan string)
 
    for _, url := range urls {
        url := url // 为循环变量创建一个局部副本
        pool.Schedule(func() {
            crawlPage(url, results)
        })
    }
 
    go func() {
        pool.Wait()
        close(results)
    }()
 
    for result := range results {
        fmt.Println(result)
    }
 
    fmt.Printf("Total time taken: %s\n", time.Since(start))
}

这个代码示例展示了如何使用Go语言创建一个简单的并发网络爬虫。它使用了一个工作池来限制同时进行的工作数量,并且使用了goroutines来执行并发任务。代码中的crawlPage函数用于模拟爬取单个网页的工作,而主函数中则是模拟了一个简单的工作流程。这个例子教会开发者如何利用Go语言的并发特性来提高程序的性能。

最后修改于:2024年08月13日 22:37

评论已关闭

推荐阅读

DDPG 模型解析,附Pytorch完整代码
2024年11月24日
DQN 模型解析,附Pytorch完整代码
2024年11月24日
AIGC实战——Transformer模型
2024年12月01日
Socket TCP 和 UDP 编程基础(Python)
2024年11月30日
python , tcp , udp
如何使用 ChatGPT 进行学术润色?你需要这些指令
2024年12月01日
AI
最新 Python 调用 OpenAi 详细教程实现问答、图像合成、图像理解、语音合成、语音识别(详细教程)
2024年11月24日
ChatGPT 和 DALL·E 2 配合生成故事绘本
2024年12月01日
omegaconf,一个超强的 Python 库!
2024年11月24日
【视觉AIGC识别】误差特征、人脸伪造检测、其他类型假图检测
2024年12月01日
[超级详细]如何在深度学习训练模型过程中使用 GPU 加速
2024年11月29日
Python 物理引擎pymunk最完整教程
2024年11月27日
MediaPipe 人体姿态与手指关键点检测教程
2024年11月27日
深入了解 Taipy:Python 打造 Web 应用的全面教程
2024年11月26日
基于Transformer的时间序列预测模型
2024年11月25日
Python在金融大数据分析中的AI应用(股价分析、量化交易)实战
2024年11月25日
AIGC Gradio系列学习教程之Components
2024年12月01日
Python3 `asyncio` — 异步 I/O,事件循环和并发工具
2024年11月30日
llama-factory SFT系列教程:大模型在自定义数据集 LoRA 训练与部署
2024年12月01日
Python 多线程和多进程用法
2024年11月24日
Python socket详解,全网最全教程
2024年11月27日