【问题标题】:is Scrapy single-threaded or multi-threaded?Scrapy 是单线程还是多线程?
【发布时间】:2014-07-15 14:38:43
【问题描述】:

Scrapy 中的并发设置很少,比如CONCURRENT_REQUESTS。这是否意味着,Scrapy 爬虫是多线程的?因此,如果我运行scrapy crawl my_crawler,它实际上会并行触发多个同时请求? 我问是因为,我读过 Scrapy 是单线程的。

【问题讨论】:

  • Scrapy 使用 Twisted,并使用单线程异步编程模型。你可以阅读它invariousplaces

标签: python multithreading scrapy web-crawler


【解决方案1】:

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

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

【讨论】:

  • 异步意味着可以有多个并发请求。您可以发送一个请求 A,在它返回之前您再发出一个请求 B,因此您有两个并行请求。
  • 我试图将我的抓取结果写入一个文本文件。我知道这是一件坏事……还是这样?
【解决方案2】:

Scrapy 是单线程框架,我们不能在一个蜘蛛中同时使用多个线程。但是,我们可以同时创建多个蜘蛛和管道以使进程并发。 Scrapy 不支持multi-threading,因为它是建立在Twisted 之上的,这是一个Asynchronous http protocol framework

【讨论】:

    【解决方案3】:

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

    如果你还没有看过这个页面,我推荐它。

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

    编辑: 我现在意识到问题是关于线程的,而不一定是异步的。不过,该链接仍然是一个很好的阅读:)

    关于您关于 CONCURRENT_REQUESTS 的问题。这个设置改变了twisted一次延迟的请求数。一旦启动了这么多请求,它将等待其中一些请求完成,然后再开始更多请求。

    【讨论】:

      猜你喜欢
      • 2018-08-16
      • 2021-12-06
      • 2021-02-20
      • 1970-01-01
      • 2014-08-18
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 2011-11-22
      相关资源
      最近更新 更多