2014-07-15 212 views
12

Scrapy中几乎没有并发设置,如CONCURRENT_REQUESTS。这是不是说,Scrapy爬虫是多线程的?所以如果我运行scrapy crawl my_crawler它会逐字地同时触发多个并发请求? 我问,因为我读过Scrapy是单线程的。是Scrapy单线程还是多线程?

+4

Scrapy使用Twisted,并使用单线程异步编程模型。你可以阅读[in](http://krondo.com/wp-content/uploads/2009/08/twisted-intro.html)[various](http://krondo.com/wp-content/uploads /2009/08/twisted-intro.html)[places](http://jessenoller.com/blog/2009/02/11/twisted-hello-asynchronous-programming) –

回答

8

Scrapy是单线程的,除了交互式shell和一些测试,请参阅source

它建立在Twisted之上,它也是单线程的,并且利用它自己的异步并发功能,如twisted.internet.interfaces.IReactorThreads.callFromThread,请参阅source

+3

然后这些设置的意义何在? –

+1

异步意味着可以有多个并发请求。您可以发送请求A,并在返回之前发出另一个请求B,以便您有两个并行请求。 –

+0

我正在尝试将我的拼贴结果写入单个文本文件。我知道明白那是一件坏事...或者它是? – deostroll

4

Scrapy可以同步执行大部分工作。但是,请求的处理是异步完成的。

如果您还没有看到它,我建议您阅读此页。

http://doc.scrapy.org/en/latest/topics/architecture.html

编辑: 我现在意识到的问题是关于线程并不见得它是否是异步与否。该链接仍然是一个很好的阅读,虽然:)

关于您CONCURRENT_REQUESTS的问题。该设置可以改变一次扭曲的请求数量。一旦开始许多请求,它将等待其中一些完成,然后再开始更多。

1

Scrapy是单线程框架,我们不能同时在一个蜘蛛内使用多个线程。但是,我们可以同时创建多个spider和pipline,以使进程并发。 Scrapy不支持multi-threading,因为它构建于Twisted,这是一个Asynchronous http protocol framework