2014-07-15 151 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