Scrapy是单线程还是多线程?

ewm0tg9j  于 2022-11-09  发布在  其他
关注(0)|答案(4)|浏览(606)

在Scrapy中有一些并发设置,比如CONCURRENT_REQUESTS。这是否意味着,Scrapy爬虫是多线程的?所以如果我运行scrapy crawl my_crawler,它会并行地触发多个并发请求?我问是因为,我读到过Scrapy是单线程的。

kyxcudwk

kyxcudwk1#

Scrapy是单线程的,除了交互式环境和一些测试,参见source
它构建在Twisted之上,Twisted也是单线程的,并利用它自己的异步并发功能,如twisted.internet.interfaces.IReactorThreads.callFromThread,请参见source

xqnpmsa8

xqnpmsa82#

Scrapy的大部分工作都是同步完成的,但是,请求的处理是异步完成的。
如果你还没有看过这个页面,我建议你看一下。
http://doc.scrapy.org/en/latest/topics/architecture.html
编辑:我现在意识到问题是关于线程的,而不一定是异步的。尽管如此,这个链接仍然是一个很好的读物:)
关于您的CONCURRENT_REQUESTS问题。此设定会变更Twisted一次延迟的要求数目。一旦启动了如此多的要求,它会等待其中一些要求完成,然后再启动更多的要求。

z3yyvxxp

z3yyvxxp3#

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

qyyhg6bp

qyyhg6bp4#

Scrapy是一个单线程框架,但我们可以在一个蜘蛛中同时使用多个线程
请阅读本文。
使用爬行器进程类,自定义设置蜘蛛程序
我们可以使用子进程来运行spider。

import subprocess
subprocess.run(["scrapy", "crawl", "quotes", "-o", "quotes_all.json"])


使用CrawlerProcess在同一进程中运行多个蜘蛛。
如果您希望每个进程运行多个spider,或者希望直接在程序中获取和使用Scrapy项目,则需要使用Scrapy的内部API。


# Run the spider with the internal API of Scrapy:

    from scrapy.crawler import Crawler, CrawlerProcess
    from scrapy.utils.project import get_project_settings

def crawler_func(spider, url):
    crawler_process = CrawlerProcess(settings)
    crawler_process.crawl(spider, url)
    crawler_process.start()

def start_spider(spider, urls):
      p = multiprocessing.Pool(100)
      return p.map(partial(crawler_func, spider), urls)

相关问题