当前位置: 首页 > article >正文

Leetcode—1242. 多线程网页爬虫【中等】Plus(多线程)

2024每日刷题(187)

Leetcode—1242. 多线程网页爬虫

在这里插入图片描述

实现代码

/**
 * // This is the HtmlParser's API interface.
 * // You should not implement it, or speculate about its implementation
 * class HtmlParser {
 *   public:
 *     vector<string> getUrls(string url);
 * };
 */
class Solution {
public:
    vector<string> crawl(string startUrl, HtmlParser htmlParser) {
        queue<string> q{{startUrl}};
        unordered_set<string> ust{{startUrl}};
        string hostname = getHostName(startUrl);
        vector<thread> threads;
        const int nthreads = std::thread::hardware_concurrency();
        mutex mtx;
        condition_variable cv;

        auto t = [&] {
            while(true) {
                unique_lock<mutex> lock(mtx);
                cv.wait_for(lock, 30ms, [&]() {
                    return q.size();
                });
                if(q.empty()) {
                    return;
                }
                auto cur = q.front();
                q.pop();
                lock.unlock();
                vector<string> urls = htmlParser.getUrls(cur);
                lock.lock();
                for(const string& url: urls) {
                    if(ust.contains(url)) {
                        continue;
                    }
                    if(url.find(hostname) != string::npos) {
                        ust.insert(url);
                        q.push(url);
                    }
                }
                lock.unlock();
                cv.notify_all();
            }
        };

        for(int i = 0; i < nthreads; i++) {
            threads.emplace_back(t);
        }

        for(auto& thread: threads) {
            thread.join();
        }
        return {ust.begin(), ust.end()};
    }
private:
    string getHostName(string& s) {
        int firstIdx = s.find_first_of('/');
        int thirdIdx = s.find_first_of('/', firstIdx + 2);
        return s.substr(firstIdx + 2, thirdIdx - firstIdx - 2);
    }
};

运行结果

在这里插入图片描述
之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!


http://www.kler.cn/news/361136.html

相关文章:

  • BurpSuite渗透工具的简单使用
  • SpringBoot 单元测试 - 登录认证在 Spring Boot 上的标准单元测试写法。
  • DruidDataSource 封clickhouse实现数据操作
  • 序列化问题记录:Jackson 与 Fastjson 的注解
  • 【YOLO学习】YOLOv5详解
  • Turn-it:优化线材重构雕塑制造
  • Java全栈经典面试题剖析6】JavaSE高级 -- 文件、IO流、序列化
  • 【计算机网络】详解数据链路层数据帧Mac地址ARP协议
  • Jetpack架构组件_LiveData组件
  • 【贪心算法】(第八篇)
  • kali——strings的使用
  • 安利一款基于canvas/svg的富文本编辑器-支持在导出PDF、DOCX
  • 华为三层交换来实现不同vlan通信问题
  • Redis-04 Redis管道
  • Flink任务报错akka size oversized
  • 基于 Hugo 的静态响应式网址导航主题
  • sh与bash的区别
  • Linux 防火墙的开启、关闭、禁用命令
  • SpringMVC 中的常用注解和用法
  • 探索Web3生态系统:社区、协议与参与者的角色