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

Jam*_*mes 10 python multithreading gil

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

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

谢谢!

Gre*_*ill 8

执行网络操作时,Python解释器不会保留GIL.如果您正在进行网络绑定的工作(如爬虫),则可以安全地忽略GIL的影响.

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


nos*_*klo 6

看看scrapy的工作原理.它可以帮到你很多.它不使用线程,但可以在同一个线程中进行多个"同时"下载.

如果你考虑一下,你只有一个网卡,所以并行处理无法真正帮助定义.

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


jat*_*ism 1

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

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

编辑:这是一个简单的示例,说明如何使用 Twisted 的 getPage 创建一个简单的网络爬虫。