使用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…

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

【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…

JVM:强软弱虚四种引用

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

python 自主学习笔记

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

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、小结 ✓ 通…

37. 解数独

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

基于Java SSM框架+Vue实现旅游资源网站项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架Vue实现旅游资源网站演示 摘要 本论文主要论述了如何使用JAVA语言开发一个旅游资源网站 &#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述旅游…

Elasticsearch:什么是向量数据库?

向量数据库定义 向量数据库是将信息存储为向量的数据库&#xff0c;向量是数据对象的数值表示&#xff0c;也称为向量嵌入。 它利用这些向量嵌入的强大功能来对非结构化数据和半结构化数据&#xff08;例如图像、文本或传感器数据&#xff09;的海量数据集进行索引和搜索。 向…

MATLAB Simulink +STM32硬件在环 (HIL)实现例程测试

MATLAB Simulink STM32硬件在环 &#xff08;HIL&#xff09;实现例程测试 &#x1f4cd;相关篇《STM32CubeMxMATLAB Simulink点灯程序》✨本例程没有使用到STM32CubeMX来创建工程&#xff08;在Simulink 中不是选择的STM32xxxbased类型的&#xff09;。 &#x1f516;STM32xxx…

基于SSM的网上手机销售系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

llama.cpp部署通义千问Qwen-14B

llama.cpp是当前最火热的大模型开源推理框架之一&#xff0c;支持了非常多的LLM的量化推理&#xff0c;生态比较完善&#xff0c;是个人学习和使用的首选。最近阿里开源了通义千问大语言模型&#xff0c;在众多榜单上刷榜了&#xff0c;是当前最炙手可热的开源中文大语言模型。…

go语言学习-并发编程(并发并行、线程协程、通道channel)

1、 概念 1.1 并发和并行 并发:具有处理多个任务的能力 (是一个处理器在处理任务)&#xff0c;cpu处理不同的任务会有时间错位&#xff0c;比如有A B 两个任务&#xff0c;某一时间段内在处理A任务&#xff0c;这时A任务需要停止运行一段时间&#xff0c;那么会切换到处理B任…

微服务的应用架构

架构描述的是在更高层次将应用拆分为子系统或模块的方法&#xff0c;以及这些子系统之间的交互关系。在一个基于微服务架构构建的应用中&#xff0c;每个服务都需要有自己的架构。 事实上&#xff0c;单体应用在复杂度较低时&#xff0c;它的生产效率是要高于微服务的。只有在…

React18 入门与进阶

React18 入门与进阶 前言一、核心概念与类组件使用1、虚拟DOM与新的渲染写法2、JSX 与 JSX 的使用3、类组件和函数组件4、类组件与类组件通信5、props详解与注意事项6、类组件中事件的使用7、类组件响应式数据实现与原理8、PureComponent 与 shouldComponentUpdate9、immutable…

Java数据结构之《构造哈夫曼树》题目

一、前言&#xff1a; 这是怀化学院的&#xff1a;Java数据结构中的一道难度中等(偏难理解)的一道编程题(此方法为博主自己研究&#xff0c;问题基本解决&#xff0c;若有bug欢迎下方评论提出意见&#xff0c;我会第一时间改进代码&#xff0c;谢谢&#xff01;) 后面其他编程题…