首页 > 数据库 >scrapy源码分析:redis分布式爬虫队列中,priority值越大,优先级越高

scrapy源码分析:redis分布式爬虫队列中,priority值越大,优先级越高

时间:2023-08-02 12:55:17浏览次数:39  
标签:优先级 redis self request priority scrapy 源码

scrapy源码分析:redis分布式爬虫队列中,priority值越大,优先级越高

一、背景

scrapy爬虫项目中,遇到scrapy的priority属性,搞不懂priority的值越大优先级越高,还是值越小优先级越高

# 通过priority修改优先级
return scrapy.Request(url=request.url, dont_filter=True, callback=spider.parse, priority=request.priority + 1)

为了搞清楚状况,直接盘scrapy源码,一探究竟。

参考:

https://blog.csdn.net/u011423145/article/details/103235874

redis

https://www.lanmper.cn/redis/t9455

https://deepinout.com/redis-cmd/redis-ordered-set-cmd/redis-cmd-zcard.html

https://www.yiibai.com/redis/sorted_sets_zremrangebyrank.html

二、版本和场景

1、scrapy版本:2.3.0

2、scrapy分布式爬虫,redis做调度器的队列。

3、Redis版本:6.2.4

先说结论:priority的值越大优先级越高;越小优先级越低。

三、源码分析

1、队列类型

# 源码位置:settings.py
# 默认的请求出队列排序, scrapy-redis请求集合, 里面做了优先级排序, 一般用这个
SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"

2、权重队列源码和解读

# 源码位置:xxx_spider.py
from scrapy_redis.queue import SpiderPriorityQueue
# 源码位置:queue.py
SpiderQueue = FifoQueue
SpiderStack = LifoQueue
SpiderPriorityQueue = PriorityQueue  # 解读1:SpiderPriorityQueue就是PriorityQueue类对象

# 解读2:PriorityQueue中有3个方法:
# (1)__len__ 私有方法返回队列的长度
# (2)push 方法将request请求对象的权重值取反得到score,并通过zadd将request对象data和取反权重值score,放入redis有序集合self.key中。
# 说明:在redis的有序集合中,score值越小,越靠前。score可以为负数。
# (3)pop 方法通过zremrangebyrank将redis有序集合self.key中,score最小的元素取出。
class PriorityQueue(Base):
    """Per-spider priority queue abstraction using redis' sorted set"""

    def __len__(self):
        """Return the length of the queue"""
        return self.server.zcard(self.key)

    def push(self, request):
        """Push a request"""
        data = self._encode_request(request)
        score = -request.priority
        # We don't use zadd method as the order of arguments change depending on
        # whether the class is Redis or StrictRedis, and the option of using
        # kwargs only accepts strings, not bytes.
        self.server.execute_command('ZADD', self.key, score, data)

    def pop(self, timeout=0):
        """
        Pop a request
        timeout not support in this queue class
        """
        # use atomic range/remove using multi/exec
        pipe = self.server.pipeline()
        pipe.multi()
        pipe.zrange(self.key, 0, 0).zremrangebyrank(self.key, 0, 0)
        results, count = pipe.execute()
        if results:
            return self._decode_request(results[0])

3、结论

priority的值越大,score的值就越小,在redis的有序集合中就越是靠前,zremrangebyrank方法取的最靠前的元素。

所以priority的值越大优先级越高;越小优先级越低。

标签:优先级,redis,self,request,priority,scrapy,源码
From: https://www.cnblogs.com/andy9468/p/17600385.html

相关文章

  • 盘点一对一直播源码iOS系统维持平台稳定功能(一):弹性扩缩容
    在移动互联网快速发展的时代,直播成为了一个火爆的行业,并成功进入到Android、iOS、鸿蒙系统中,人们只需具备网络与能下载直播平台的设备便可使用到一对一直播源码平台,所以几乎全世界的人们都成为了平台的用户,这就使得一对一直播源码平台的用户人数的庞大,但毕竟一对一直播源码平台是......
  • react源码解析手写ReactDom.js和React
    前言大家好我是歌谣今天给大家带来react源码部分的实现创建项目首先npxcreate-react-appxxx降为17"dependencies":{"@testing-library/jest-dom":"^5.11.4","@testing-library/react":"^11.1.0","@testing-library/user-event&......
  • Redis 发生高延迟时
    Redis是一种内存数据库,将数据保存在内存中,读写效率要比传统的将数据保存在磁盘上的数据库要快很多。但是Redis也会发生延迟时,这是就需要我们对其产生原因有深刻的了解,以便于快速排查问题,解决Redis的延迟问题一条命令执行过程在本文场景下,延迟(latency)是指从客户端发送命......
  • Redis从入门到放弃(6):持久化
    1、引言Redis作为一种高性能的内存数据存储系统,常被用作缓存、会话存储、消息队列等多种应用场景。然而,由于其数据存储在内存中,一旦发生意外或服务器重启,数据就会丢失。为了保障数据的持久性和安全性。Redis提供了多种持久化方案:RDB(RedisDataBase):按指定的时间间隔执行数据集......
  • redis 如何保证数据一致性
    引言日常开发中常会使用redis作为项目中的缓存,只要我们使用Redis缓存,就必然会面对缓存和数据库间的一致性保证问题。而且如果数据不一致,那么应用从缓存中读取的数据就不是最新数据,可能会导致严重的业务问题。为什么会数据不一致数据一致性:指的是redis缓存跟数据库的数据的一......
  • CBV源码
    三板斧问题#在视图函数中写函数和普通函数不太一样#Django中使用的局部是requestdefindex(request): passHttpResponse:返回的字符串render:返回的HTML页面,并且再返回给浏览器之前还可以给HTML文件传值redirect:重定向"""所有的视图函数不能没有返回值,而且返回的对象必......
  • TypeChat源码分析:基于大语言模型的定制化 AI Agent 交互规范
    TypeChat源码分析:基于大语言模型的定制化AIAgent交互规范本文深入介绍了微软最近发布的TypeChat项目,该项目允许开发者定义大语言模型返回的响应结构。通过分析源代码,探讨了Prompt的基本概念,为定制化开发互动式AIAgent提供便捷的解决方案。文章着重介绍TypeChat的关键......
  • 【源码】MyBatis
      mybatis-springpublicclassSqlSessionFactoryBeanimplementsFactoryBean<SqlSessionFactory>,InitializingBean,ApplicationListener<ApplicationEvent>{ bean初始化publicvoidafterPropertiesSet()throwsException{Assert.notNull(......
  • 【glib】源码编译
    1、依赖安装zlib库##运行下述命令安装zlib$yuminstall-yzlib$cp/usr/local/lib64/libz.so/usr/lib64安装meson$yuminstall-ymeson2、安装从https://download.gnome.org/sources/glib/下载需要安装的版本。然后运行下述命令执行编译。$mesonsetup_b......
  • wix 安装vcredist
    <DirectoryId="TARGETDIR"Name="SourceDir"><!--<DirectoryId="ProgramFilesFolder">--><DirectoryId="ProgramFiles64Folder"><DirectoryId="CompanyFolder&quo......