使用Redis构建任务队列

文章目录

  • 第1关:先进先出任务队列
  • 第2关:优先级任务队列
  • 第3关:定时任务队列


第1关:先进先出任务队列

编程要求
在Begin-End区域编写 add_task(task_name) 函数,实现将任务加入队列的功能,具体参数与要求如下:

方法参数 task_name 是要加入的任务名称;
推入任务的实现:将新的任务从列表 task:list 的尾部插入。
编写 pop_task() 函数,实现获取一个任务的功能,具体参数与要求如下:

获取任务的实现:从列表 task:list 的头部阻塞式的弹出一个值,最长等待10秒,若超时仍未获取到,则重试该操作,直至弹出一个值;
任务返回的实现:获取任务成功后,返回该值中弹出的元素值。
测试说明
平台会对你编写的代码进行测试:

测试输入:my_task;
预期输出:

测试 add_task 方法…
推入任务:my_task
当前任务队列:[‘my_task’]
测试 pop_task 方法…
出队列任务:my_task
当前任务队列:[]
在多线程下测试队列工作…
出队列任务:new task

代码示例如下:

#!/usr/bin/env python
#-*- coding:utf-8 -*-import redisconn = redis.Redis()# 将任务加入队列
def add_task(task_name):# 请在下面完成要求的功能#********* Begin *********#conn.rpush("task:list",task_name)#********* End *********## 获取一个任务
def pop_task():# 请在下面完成要求的功能#********* Begin *********#while True:task = conn.blpop("task:list",10)if not task:continuereturn task[1]#********* End *********#

在这里插入图片描述

第2关:优先级任务队列

编程要求
在Begin-End区域编写 add_task_list(list_name, priority) 函数,实现设置任务队列优先级的功能,具体参数与要求如下:

方法参数 list_name 是要加入的任务队列名字,priority 是要设置的优先权重,值越大则级别越高;
设置队列优先级的实现:为了能按照优先权重排列任务队列,将任务队列加入到有序集合 task:priority 中,分值为 priority。
编写 add_task(list_name, task_name) 函数,实现将任务加入队列的功能,具体参数与要求如下:

方法参数 list_name 是要加入的任务队列名字,task_name 是要加入的任务名称;
推入任务的实现:将新的任务从指定的列表尾部插入。
编写 pop_task()函数,实现获取一个任务的功能,具体参数与要求如下:

排序任务队列的实现:将有序集合 task:priority 中的所有成员按照分值递减的顺序排列;
获取任务的实现:按照上述队列的顺序,从第一个非空列表的头部阻塞式的弹出一个值,最长等待10秒,若超时仍未获取到,则重试该操作,直至弹出一个值;
任务返回的实现:获取任务成功后,返回该值中弹出的元素值。
测试说明
平台会对你编写的代码进行测试:

测试输入:h,e,l,o,d,u,c,r;
预期输出:

测试 add_task_list 方法…
加入三个任务队列:[‘task:list:high’, ‘task:list:mid’, ‘task:list:low’]
测试 add_task 方法…
推入任务:h 到 task:list:high
推入任务:e 到 task:list:mid
推入任务:l 到 task:list:low
推入任务:o 到 task:list:high
推入任务:d 到 task:list:mid
推入任务:u 到 task:list:low
推入任务:c 到 task:list:high
推入任务:r 到 task:list:mid
当前 task:list:high 任务队列:[‘h’, ‘o’, ‘c’]
当前 task:list:mid 任务队列:[‘e’, ‘d’, ‘r’]
当前 task:list:low 任务队列:[‘l’, ‘u’]
测试 pop_task 方法…
出队列顺序:[‘h’, ‘o’, ‘c’, ‘e’, ‘d’, ‘r’, ‘l’, ‘u’]
当前 task:list:high 任务队列:[]
当前 task:list:mid 任务队列:[]
当前 task:list:low 任务队列:[]
在多线程下测试队列工作…
出队列任务:new task

代码示例如下:

#!/usr/bin/env python
#-*- coding:utf-8 -*-import redisconn = redis.Redis()# 新建任务队列/改变任务队列优先级
def add_task_list(list_name, priority):# 请在下面完成要求的功能#********* Begin *********#conn.zadd("task:priority",list_name,priority)#********* End *********## 将任务加入队列
def add_task(list_name, task_name):# 请在下面完成要求的功能#********* Begin *********#conn.rpush(list_name,task_name)#********* End *********## 获取一个任务
def pop_task():# 请在下面完成要求的功能#********* Begin *********#while True:task = conn.blpop(conn.zrevrange("task:priority",0,-1),10)if not task:continuereturn task[1]#********* End *********

在这里插入图片描述

第3关:定时任务队列

编程要求
在Begin-End区域编写 execute_later(task_name, delay=0) 函数,实现添加定时任务的功能,具体参数与要求如下:

方法参数 task_name 是要加入的任务名称,delay 是任务的延迟时间;
添加定时任务的实现:若延迟时间大于0,则将任务加入到有序集合 task:delayed 中,分值为任务的执行时间,等于当前时间戳加上延迟时间;
添加普通任务的实现:若延迟时间小于等于0,则将其插入到列表task:list的尾部。
编写 pop_task() 函数,实现转移可执行任务的功能,具体参数与要求如下:

获取队列中第一个任务的实现:不断尝试获取有序集合task:delayed中按分值递增顺序的第一个元素;
判断该任务是否可执行的实现:若未取到任务或者任务的执行时间未到,则休眠 0.01 秒,然后继续尝试获取第一个任务;
任务转移的实现:从有序集合task:delayed中移除该任务,成功后,将该任务插入到列表task:list的尾部。
测试说明
平台会对你编写的代码进行测试:

测试输入:无;
预期输出:

测试 execute_later 方法…
添加任务,task-0 ,延迟:0
添加任务,task-1 ,延迟:0.5
添加任务,task-2 ,延迟:0
添加任务,task-3 ,延迟:1.5
普通任务队列长度:2
定时执行任务队列内容:[‘task-1’, ‘task-3’]
测试 pop_task 方法…
等待0.6秒后,普通任务队列长度为:3
普通任务队列内容为:[‘task-0’, ‘task-2’, ‘task-1’]
等待1.6秒后,普通任务队列长度为:4
普通任务队列内容为:[‘task-0’, ‘task-2’, ‘task-1’, ‘task-3’]

代码示例如下:

#!/usr/bin/env python
#-*- coding:utf-8 -*-import time
import redisconn = redis.Redis()# 添加定时任务
def execute_later(task_name, delay=0):# 请在下面完成要求的功能#********* Begin *********#if delay > 0:conn.zadd("task:delayed",task_name,time.time()+delay)else:conn.rpush("task:list",task_name)#********* End *********## 转移可执行任务
def pop_task():# 请在下面完成要求的功能#********* Begin *********#while True:task = conn.zrange("task:delayed",0,0,withscores=True)if not task or task[0][1] > time.time():time.sleep(0.01)continuetask = task[0][0]if conn.zrem("task:delayed",task):conn.rpush("task:list",task)    #********* End *********#

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/194337.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tomcat控制台中文信息显示乱码

问题现象 我的tomcat版本是10.1版本。 在cmd下启动tomcat,会新打开控制台输出窗口: 控制台窗口输出的中文信息是乱码: 问题原因 产生这个问题的原因是:控制台窗口的编码和输出到控制台窗口的日志信息编码不一致。 查看tomc…

Kubernetes学习笔记-Part.01 Kubernets与docker

目录 Part.01 Kubernets与docker Part.02 Docker版本 Part.03 Kubernetes原理 Part.04 资源规划 Part.05 基础环境准备 Part.06 Docker安装 Part.07 Harbor搭建 Part.08 K8s环境安装 Part.09 K8s集群构建 Part.10 容器回退 第一章 Kubernets与docker Docker是一种轻量级的容器…

Linux 基础命令

1 Linux 基础 1.1 用户类型 1.2 终端 Terminal 设备终端:键盘,鼠标,显示器 1.2.1 终端类型 1.2.2 查看当前的终端设备 tty 命令可以查看当前所在的终端 范例: # tty 可以查看当前所在的终端 $ tty /dev/pts/1 $ who am i ro…

ChatGPT有什么新奇的使用方式?

2023,ChatGPT几乎席卷了所有行业,并且具有不可测量的巨大潜力等着我们去挖掘。 越来越多人对ChatGPT的应用产生兴趣,知乎上“ChatGPT有什么新奇的使用方式?”这一个热门话题的兴起就是最好的证明。 写作,毫无疑问&…

SmartSoftHelp8,数据库字段详细文档自动生成工具

数据库开发文档自动生成 包括数据库设计详细信息: 数据库字段名称,数据类型,大小,是否主键,说明等 一键自动生成开发需求文档 导出html 格式方便查询 下载地址 https://pan.baidu.com/s/1zBgeYsqWnSlNgiKPR2lUYg…

目标检测算法改进系列之添加变核卷积AKConv模块

AKConv变核卷积 KConv的主要思想:AKConv(可变核卷积)主要提供一种灵活的卷积机制,允许卷积核具有任意数量的参数和采样形状。这种方法突破了传统卷积局限于固定局部窗口和固定采样形状的限制,从而使得卷积操作能够更加…

oops-framework框架 之 本地存储(五)

引擎: CocosCreator 3.8.0 环境: Mac Gitee: oops-game-kit 注: 作者dgflash的oops-framework框架QQ群: 628575875 简介 在CocosCreator中,本地存储主要使用sys.localStorage 接口,通过 key-value的格式进…

【iOS控件】—— UIPickerView的使用

【iOS控件】—— UIPickerView的使用 一. 简述UIPickerView1. 什么是UIPickerView2. UIPickerView遵守的协议 二. 测试Demo三. 总结 一. 简述UIPickerView 先看一下UIPickerView的效果图: 1. 什么是UIPickerView UIPickerView是iOS平台上的一个用户界面元素&am…

Excel导入组件的封装以及使用页面点击弹出该弹框

封装的组件 <template><el-dialogwidth"500px"title"员工导入":visible"showExcelDialog"close"$emit(update:showExcelDialog, false)"><el-row type"flex" justify"center"><div class&q…

轻松生成二维码:SpringBoot 与 ZXing 完美结合(综合指南)-开源充电桩平台(充电桩平台源码)

分享一套开源充电桩云平台&#xff08;v2.5.1&#xff09;-- 支持二轮(电动自行车)、四轮(电动汽车) 文章目录 前言一、1 前言&#xff1f;二、2 介绍QR码和ZXing三、3 springboot整合zxing添加ZXing依赖生成二维码生成条形码 分享一套开源充电桩云平台&#xff08;v2.5.1&…

JVM:强软弱虚四种引用

下面依次解释五种引用 一、强引用 把一个对象赋值给一个引用变量&#xff0c;就相当于把这个对象的强引用放到变量中。 只要对象可达&#xff0c; GC一定不会回收这个对象&#xff08;A1&#xff09; 二、软引用 当一个对象&#xff08;A2&#xff09;没有强引用时&#xff…

python 自主学习笔记

文章目录 前言相关教程模板字符串JavaScriptC#Python 临时变量C#的ValueTuplePython字典 自定义模块化封装的文件路径问题解决方案 暂时结束 前言 最近在学halcon&#xff0c;机器视觉&#xff0c;越学越发现&#xff0c;python是无法避免的语言。因为python用途实在是太广了。…

c/c++的字符和字符串输入输出

注&#xff1a; 1.下面这些为本人大学四年所用过的处理办法&#xff0c; 至今为止遇到的所有编程题都能够使用。如果需要了解更多关于putchar,cin.get,cin.getline等的请自行搜索。 2.getchar相当于获取一个字符&#xff0c;可以实现单个字符的输入以及通过循环实现多个字符输…

英语语法学习 - 每周更新学英语知识点

目录 询问 Would Some用法 Any用法 数量限定词 数量限定词之 all 和 both Everybody/Everyone 不定代词指代人 不定代词搭配“else”用法 bring It takes time to ... 询问 Would would 主语 like noun/to do? 询问他人意愿 Would you like dinner&#xff…

使用 Unsplash API 生成随机图片

Unsplash 如果你想使用免费版权的图片时&#xff0c;无论你是否用于商业用途&#xff0c;Unsplash 是不错的选择。 我自己也经常用它来制作大型背景图片 虽然他们为开发人员提供了很棒的 API&#xff0c;但他们也提供了通过 URL 访问随机图片的选项。 1. 默认随机 请看这个例子…

ChaoJi充电连接装置典型试验案例分析 GB/T 20234.1充电连接装置型式试验变化分析

GB/T 20234.1充电连接装置典型试验变化分析 1、ChaoJi充电连接装置典型试验案例分析 1.1、大功率直流充电接口 1.2、枪线尺寸、重量、面积数据对比 1.3、枪线温升对比试验 1.4、chaoji 枪线温升试验 1.5、chaoji枪线防护等级试验 1.6、GB/T 20234.4项目列表 1.7、小结 ✓ 通…

GenericServlet 和 HttpServlet

在 Java Web 开发中&#xff0c;GenericServlet 和 HttpServlet 是两个重要的类&#xff0c;用于处理客户端的请求和生成响应。它们是基于 Java Servlet API 的关键组件&#xff0c;为开发人员提供了处理 Web 请求和实现服务器端逻辑的强大工具。 GenericServlet GenericServ…

Failed building wheel for opencv-python which use PEP 517

这主要是opencv-python版本更新以后wheels也更新了&#xff0c;但是相关安装软件没有及时适配&#xff0c;所以不管是使用pip直接安装还是换源其实效果都是报错&#xff0c;解决方法就是直接指定安装旧版opencv-python完事儿&#xff0c;例如&#xff1a; pip3 install opencv…

37. 解数独

题目描述 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考示例图&#xff09; …

H264初探

ref&#xff1a; 【科普】“视频”是怎么来的&#xff1f;H.264、码率这些词又是什么意思&#xff1f;_哔哩哔哩_bilibili H.264编解码原理浅析 - 知乎