如何在scrapyd上运行的spider之间共享对象实例

2024-10-01 19:32:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要在scrapyd上运行的crawler/spider之间共享一个公共对象实例。 最好的方案是将对象的方法挂接在每个spider的信号上,类似于

ext = CommonObject()
crawler.signals.connect( ext.onSpiderOpen,   signal = signals.spider_opened )
crawler.signals.connect( ext.onSpiderClose,  signal = signals.spider_closed )

etc..

其中CommonObject将只实例化和初始化一次,并将其方法公开给所有正在运行的爬行进程/蜘蛛(我不介意为此使用singleton)。在

根据我的研究,我知道我有两个选择:

  1. 在一个CrawlerProcess中运行所有spider/crawler,其中CommonObject也将被实例化。在
  2. 每个CrawlerProcess运行一个spider/crawler(默认的scrapy(d)行为),在reactor中的某个地方实例化CommonObject,并可能使用远程访问它扭曲.spread.pb。在

问题:

  1. 在使用第一个选项而不是让scrapyd管理进程(第二个选项)时,是否存在CPU利用率下降(CPU利用率降低)?CrawlerProcess是否能够并行运行更多的爬虫程序(非顺序)?在同一个CrawlerProcess中,如何在运行时调度更多的spider?(我明白crawlerprocesss.start()正在阻塞。)
  2. 我没有足够的先进性来实现第二个选项(实际上不确定它是否可行)。有没有人会画一个示例实现?在
  3. 也许我遗漏了什么,还有别的办法吗?在

Tags: 实例方法signal进程选项connect利用率cpu

热门问题