Python中的多线程爬虫是否真的加快了速度?

时间:2010-05-13 23:02:43

标签: python multithreading gil

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

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

谢谢!

5 个答案:

答案 0 :(得分:8)

执行网络操作时,Python解释器不会保留GIL。如果您正在进行网络绑定的工作(如爬虫),您可以放心地忽略GIL的效果。

另一方面,如果您创建了许多正在处理的线程(下载后),您可能需要测量性能。限制线程数量将减少GIL对您的性能的影响。

答案 1 :(得分:6)

了解scrapy的工作原理。它可以帮到你很多。它不使用线程,但可以在同一个线程中进行多个“同时”下载。

如果你考虑一下,你只有一张网卡,所以并行处理根本无法提供帮助。

在发送另一个请求之前,scrapy所做的是只是不等待来响应一个请求。全部在一个线程中。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

异步网络操作很容易并且通常是单线程的。网络I / O几乎总是具有比CPU更高的延迟,因为你真的不知道页面需要多长时间才能返回,这就是async闪耀的地方,因为异步操作的重量比线程轻得多。

编辑:这是simple example如何使用Twisted的getPage创建一个简单的网页抓取工具。

答案 4 :(得分:0)

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

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