V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
taogen
V2EX  ›  程序员

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

  •  
  •   taogen ·
    tagnja · Oct 15, 2019 · 3760 views
    This topic created in 2386 days ago, the information mentioned may be changed or developed.

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

    假设前提:

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

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

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

    18 replies    2019-10-15 15:13:46 +08:00
    xeaglex
        1
    xeaglex  
       Oct 15, 2019 via Android   ❤️ 1
    尽量调大。CPU,硬盘 IO,网络 IO,三者之一跑满其一为止
    wangyzj
        2
    wangyzj  
       Oct 15, 2019
    把 CPU 干满
    wangkai0351
        3
    wangkai0351  
       Oct 15, 2019   ❤️ 1
    我是外行不懂这个,爬虫应该是 IO 密集操作,多线程的异步搞了没有。
    taogen
        4
    taogen  
    OP
       Oct 15, 2019
    @wangkai0351 #3 异步没有考虑到,等会研究一下。十分感谢~
    ClericPy
        5
    ClericPy  
       Oct 15, 2019   ❤️ 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  
       Oct 15, 2019 via Android
    这是什么网站这么好爬啊,另外,出租人道主义,别太过分吧,太过分别人加上验证码,加上 ip 限制,大家都加班
    taogen
        7
    taogen  
    OP
       Oct 15, 2019 via Android
    @sadfQED2 #6 这只是理论方法讨论。实际场景肯定会有很多阻碍,也会多方面考虑的。
    RicardoY
        8
    RicardoY  
       Oct 15, 2019 via Android   ❤️ 1
    要上异步 io 的 如果希望效率好的话 scrapy 或者 pyspider 考虑一下
    ddddad
        9
    ddddad  
       Oct 15, 2019
    跟 cpu 核数差不多就可以了,再多线程切换消耗比较大。影响因素也挺多的

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

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

    感觉某些人很排斥,不过,谢谢大家的法律提醒。
    lishunan246
        15
    lishunan246  
       Oct 15, 2019
    这种搞法一般叫压力测试。
    taogen
        16
    taogen  
    OP
       Oct 15, 2019 via Android
    @lishunan246 #15 只是讨论的是客户端网络 IO 性能,不涉及服务端
    484A4B
        17
    484A4B  
       Oct 15, 2019   ❤️ 1
    一般是用进程+协程比较好
    进程数量一般是 N+1,N 是 CPU 线程数
    协程数量根据 CPU 性能,几十到几百不等
    taogen
        18
    taogen  
    OP
       Oct 15, 2019
    @484A4B #17 多谢大佬提出具体参数。其实讨论方法和原理就够了。再次感谢
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1003 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 59ms · UTC 19:10 · PVG 03:10 · LAX 12:10 · JFK 15:10
    ♥ Do have faith in what you're doing.