scrapy在爬网页的时候是自动采用多线程的吗

scrapy基于twisted异步IO框架,downloader是多线程的。但是,由于python使用GIL(全局解释器锁,保证同时只有一个线程在使用解释器),这极大限制了并行性,在处理运算密集型程序的时候,Python的多线程效果很差,而如果开多个线程进行耗时的IO操作时,Python的多线程才能发挥出更大的作用。(因为Python在进行长时IO操作时会释放GIL)所以简单的说,scrapy是多线程的,不许要再设置了,由于目前版本python的特性,多线程地不是很完全,但实际测试scrapy效率还可以。
■网友
自动的。配置里可以设线程数。代码写的不对的话,有时候多到关不掉。。
■网友
自动就是多线程的,修改线程数可以参看这个文章。http://twistedmatrix.com/documents/10.1.0/core/howto/threading.html
■网友
因为Python GIL的存在,scrapy无论如何设置都是单线程的。Scrapy里默认是10线程的设置是指的Twisted的线程,可以用来并行处理DNS之类的。
【scrapy在爬网页的时候是自动采用多线程的吗】 但上面这些都不重要,因为爬虫是IO密集型的操作,所以只要有并发就可以了,无论是利用协程,callback还是其他方式实现并发。所以你要修改的不是线程数目而是Scrapy里request的并行数,只要这个数目大了一般速度都会增快,如果并行大了速度却没有提升,可能是DOWNLOAD_DELAY太大了,或者用了blocking的pipeline,等等原因吧需要自己去思考
这种问题在上问没什么意义,不如直接去仔细读读文档

■网友
scrapy自带twisted线程池,默认是10个线程。
■网友
默认启动的话,可以看到scrapy有10个线程。但是,进行download以及parse 等一般性操作的时候,都是单线程的——都是在同一个线程内。修改REACTOR_THREADPOOL_MAXSIZE配置可以改变启动的线程数。scrapy文档对REACTOR_THREADPOOL_MAXSIZE的说明是:The maximum limit for Twisted Reactor thread pool size. This is common multi-purpose thread pool used by various Scrapy components. Threaded DNS Resolver, BlockingFeedStorage, S3FilesStore just to name a few. Increase this value if you’re experiencing problems with insufficient blocking IO.从这里看,DNS 解析等会用到这些线程。PS:因需要改写了默认downloader,改写后启动只有1个线程。只好追查自定义的downloader有什么问题。最后只看到10个线程只是干了DNS解析的事。
■网友
看文档
CONCURRENT_REQUESTSDefault: 16The maximum number of concurrent (ie. simultaneous) requests that will be performed by the Scrapy downloader.默认16个并发请求
Settings - Scrapy 1.5.1 documentation


■网友
在哪个文件中修改scrapy的线程数目呢?我看网上都说使用from twisted.internet import reactorreactor.suggestThreadPoolSize(30)这两句话就可以修改,但是我试了没有用。。


    推荐阅读