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

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

  •  
  •   taogen · 56 天前 · 1454 次点击
    这是一个创建于 56 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    假设前提:

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

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

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

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

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

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

    感觉某些人很排斥,不过,谢谢大家的法律提醒。
        15
    lishunan246   56 天前
    这种搞法一般叫压力测试。
        16
    taogen   56 天前 via Android
    @lishunan246 #15 只是讨论的是客户端网络 IO 性能,不涉及服务端
        17
    484A4B   56 天前   ♥ 1
    一般是用进程+协程比较好
    进程数量一般是 N+1,N 是 CPU 线程数
    协程数量根据 CPU 性能,几十到几百不等
        18
    taogen   56 天前
    @484A4B #17 多谢大佬提出具体参数。其实讨论方法和原理就够了。再次感谢
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2743 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 28ms · UTC 13:06 · PVG 21:06 · LAX 05:06 · JFK 08:06
    ♥ Do have faith in what you're doing.