V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
taogen
V2EX  ›  程序员

单机多线程爬虫,是不是线程池大小越大越好?

  •  
  •   taogen ·
    tagnja · 2019-10-15 12:10:10 +08:00 · 3230 次点击
    这是一个创建于 1626 天前的主题,其中的信息可能已经有所发展或是发生改变。

    RT 想问一下,关于爬虫效率的问题。

    假设前提:

    爬虫服务器:1. 单机。2. 网络 1000 Mpbs。3. 硬件( CPU,内存条,磁盘)当前市场高配水平。

    目标网站服务器:1. 不限制 IP,不限访问频率。2. 无限的响应速度(高并发,低延迟)。

    请问各位大佬,在上面的前提下,想要最大化爬虫的效率,有哪些优化措施?另外,是不是线程池大小越大越好?

    18 条回复    2019-10-15 15:13:46 +08:00
    xeaglex
        1
    xeaglex  
       2019-10-15 12:12:50 +08:00 via Android   ❤️ 1
    尽量调大。CPU,硬盘 IO,网络 IO,三者之一跑满其一为止
    wangyzj
        2
    wangyzj  
       2019-10-15 12:30:57 +08:00
    把 CPU 干满
    wangkai0351
        3
    wangkai0351  
       2019-10-15 12:37:19 +08:00   ❤️ 1
    我是外行不懂这个,爬虫应该是 IO 密集操作,多线程的异步搞了没有。
    taogen
        4
    taogen  
    OP
       2019-10-15 12:45:38 +08:00
    @wangkai0351 #3 异步没有考虑到,等会研究一下。十分感谢~
    ClericPy
        5
    ClericPy  
       2019-10-15 12:47:09 +08:00   ❤️ 1
    以前在 python 里测试过, 1 核 CPU, 线程并发 1 到 2 , 提升明显, 2 到 5 变化也很大, 超过 5, 线程切换开销比较大的情况下, 耗费时间就没那么明显的优势了. python3 ThreadPoolExecutor 官方建议的好像是 n*5, 也就是 pool size 是 None 的时候
    if max_workers is None:
    # Use this number because ThreadPoolExecutor is often
    # used to overlap I/O instead of CPU work.
    max_workers = (os.cpu_count() or 1) * 5

    不过协程的时候就不会太讲究了, 开 100 并发, 性能一直是线程三倍以上
    sadfQED2
        6
    sadfQED2  
       2019-10-15 12:53:17 +08:00 via Android
    这是什么网站这么好爬啊,另外,出租人道主义,别太过分吧,太过分别人加上验证码,加上 ip 限制,大家都加班
    taogen
        7
    taogen  
    OP
       2019-10-15 13:12:58 +08:00 via Android
    @sadfQED2 #6 这只是理论方法讨论。实际场景肯定会有很多阻碍,也会多方面考虑的。
    RicardoY
        8
    RicardoY  
       2019-10-15 13:27:14 +08:00 via Android   ❤️ 1
    要上异步 io 的 如果希望效率好的话 scrapy 或者 pyspider 考虑一下
    ddddad
        9
    ddddad  
       2019-10-15 13:35:16 +08:00
    跟 cpu 核数差不多就可以了,再多线程切换消耗比较大。影响因素也挺多的

    ps:影响网站运行就违法了
    lolizeppelin
        10
    lolizeppelin  
       2019-10-15 13:36:39 +08:00
    要抓住重点,池不池不重要,核心是要跑满 cpu
    但是要避免线程多了上下问切换是浪费掉的

    因为 python 多线程是废的,根本不用考虑多线程, 协程+多进程就是
    taogen
        11
    taogen  
    OP
       2019-10-15 13:41:34 +08:00 via Android
    @lolizeppelin #10 豁然开朗,多谢大佬指点
    zjh6
        12
    zjh6  
       2019-10-15 13:48:02 +08:00
    其实爬虫没用.因为没啥值得爬的.
    droiz
        13
    droiz  
       2019-10-15 13:50:12 +08:00 via iPhone
    做爬虫也得有点道德啊,把人家打死了,追究起来你跑不了的
    taogen
        14
    taogen  
    OP
       2019-10-15 14:11:38 +08:00 via Android
    不是做爬虫的,只是一个后端 CRUD boy。最近学了一些爬虫相关知识,今天脑子里突然想到这个问题,所以发帖讨论一下,只是想加深一下理解。

    感觉某些人很排斥,不过,谢谢大家的法律提醒。
    lishunan246
        15
    lishunan246  
       2019-10-15 14:19:11 +08:00
    这种搞法一般叫压力测试。
    taogen
        16
    taogen  
    OP
       2019-10-15 14:26:44 +08:00 via Android
    @lishunan246 #15 只是讨论的是客户端网络 IO 性能,不涉及服务端
    484A4B
        17
    484A4B  
       2019-10-15 15:04:37 +08:00   ❤️ 1
    一般是用进程+协程比较好
    进程数量一般是 N+1,N 是 CPU 线程数
    协程数量根据 CPU 性能,几十到几百不等
    taogen
        18
    taogen  
    OP
       2019-10-15 15:13:46 +08:00
    @484A4B #17 多谢大佬提出具体参数。其实讨论方法和原理就够了。再次感谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5448 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 08:45 · PVG 16:45 · LAX 01:45 · JFK 04:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.