【发布时间】:2014-07-15 14:38:43
【问题描述】:
Scrapy 中的并发设置很少,比如CONCURRENT_REQUESTS。这是否意味着,Scrapy 爬虫是多线程的?因此,如果我运行scrapy crawl my_crawler,它实际上会并行触发多个同时请求?
我问是因为,我读过 Scrapy 是单线程的。
【问题讨论】:
标签: python multithreading scrapy web-crawler
Scrapy 中的并发设置很少,比如CONCURRENT_REQUESTS。这是否意味着,Scrapy 爬虫是多线程的?因此,如果我运行scrapy crawl my_crawler,它实际上会并行触发多个同时请求?
我问是因为,我读过 Scrapy 是单线程的。
【问题讨论】:
标签: python multithreading scrapy web-crawler
Scrapy 是单线程的,除了交互式 shell 和一些测试,参见source。
它建立在Twisted 之上,它也是单线程的,并利用了它自己的异步并发能力,例如twisted.internet.interfaces.IReactorThreads.callFromThread,参见source。
【讨论】:
Scrapy 是单线程框架,我们不能在一个蜘蛛中同时使用多个线程。但是,我们可以同时创建多个蜘蛛和管道以使进程并发。
Scrapy 不支持multi-threading,因为它是建立在Twisted 之上的,这是一个Asynchronous http protocol framework。
【讨论】:
Scrapy 同步完成大部分工作。但是,请求的处理是异步完成的。
如果你还没有看过这个页面,我推荐它。
http://doc.scrapy.org/en/latest/topics/architecture.html
编辑: 我现在意识到问题是关于线程的,而不一定是异步的。不过,该链接仍然是一个很好的阅读:)
关于您关于 CONCURRENT_REQUESTS 的问题。这个设置改变了twisted一次延迟的请求数。一旦启动了这么多请求,它将等待其中一些请求完成,然后再开始更多请求。
【讨论】: