【问题标题】:Does a multithreaded crawler in Python really speed things up?Python 中的多线程爬虫真的可以加快速度吗?
【发布时间】:2010-05-13 23:02:42
【问题描述】:

正在寻找用 python 编写一个小的网络爬虫。我开始研究将其编写为多线程脚本,一个线程池下载和一个池处理结果。由于 GIL,它实际上会同时下载吗? GIL 如何影响网络爬虫?每个线程会从套接字中提取一些数据,然后转到下一个线程,让它从套接字中提取一些数据,等等……?

基本上我问的是在 python 中做一个多线程爬虫真的会比单线程给我带来很多性能吗?

谢谢!

【问题讨论】:

    标签: python multithreading gil


    【解决方案1】:

    在进行网络操作时,Python 解释器不会持有 GIL。如果您正在从事网络绑定的工作(如爬虫),则可以放心地忽略 GIL 的影响。

    另一方面,如果您创建大量线程进行处理(下载后),您可能想要衡量您的性能。限制那里的线程数将减少 GIL 对性能的影响。

    【讨论】:

      【解决方案2】:

      看看scrapy 是如何工作的。它可以帮助你很多。它不使用线程,但可以在同一个线程中进行多个“同时”下载。

      如果你仔细想想,你只有一个网卡,所以从定义上说并行处理并不能真正提供帮助。

      scrapy 所做的是只是不要等待等待一个请求的响应,然后再发送另一个请求。全部在一个线程中。

      【讨论】:

        【解决方案3】:

        当涉及到抓取时,您最好使用基于事件的东西,例如 Twisted,它使用非阻塞异步套接字操作来获取和返回数据,而不是阻塞每个操作。

        异步网络操作很容易并且通常是单线程的。网络 I/O 的延迟几乎总是比 CPU 的延迟高,因为你真的不知道返回页面需要多长时间,而这正是异步大放异彩的地方,因为异步操作比线程轻得多。

        编辑:这里是simple example,讲述如何使用 Twisted 的 getPage 创建一个简单的网络爬虫。

        【讨论】:

        • 不要使用 Twisted。使用 gevent。它在幕后使用 async io,但允许您以简单的多线程方式编写代码。
        【解决方案4】:

        另一个考虑因素:如果您正在抓取单个网站,并且服务器对您可以从您的 IP 地址发送的请求的频率进行了限制,那么添加多个线程可能没有任何区别。

        【讨论】:

          【解决方案5】:

          是的,多线程抓取显着提高了处理速度。这不是 GIL 成为问题的情况。您正在失去大量空闲的 CPU 和未使用的带宽来等待请求完成。如果您正在抓取的网页在您的本地网络中(一种罕见的抓取情况),那么多线程和单线程抓取之间的差异可能会更小。

          您可以使用一到“n”个线程自己尝试基准测试。我在Discovering Web Resources上写了一个简单的多线程爬虫,在Automated Discovery of Blog Feeds and Twitter, Facebook, LinkedIn Accounts Connected to Business Website上写了一篇相关文章。您可以选择使用多少线程来更改 FocusedWebCrawler 中的 NWORKERS 类变量。

          【讨论】:

            猜你喜欢
            • 2014-08-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-07-29
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多