使用Redis构建任务队列

news2025/3/10 5:20:22

文章目录

  • 第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 redis
 
conn = 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:
            continue
        return 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 redis

conn = 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:
            continue
        return 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 redis
 
conn = 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)
            continue
 
        task = task[0][0]
        if conn.zrem("task:delayed",task):
            conn.rpush("task:list",task)    
 
    #********* End *********#

在这里插入图片描述


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

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

相关文章

C++基础 -35- string类

string类的格式 string a;如下图,使用string类比常规的字符串处理方便很多 而且需要进行的字符串处理,在类中都能完成 #include "iostream"using namespace std;extern "C" {#include "string.h" }int main() {//c的写…

Java基本数据类型详解

✨个人主页:全栈程序猿的CSDN博客 💨系列专栏:Java从入门到精通 ✌座右铭:编码如诗,Bug似流星,持续追求优雅的代码,解决问题如同星辰般自如 Java是一种强类型语言,数据类型在程序中起…

Prefix-Tuning 论文概述

Prefix-Tuning 论文概述 前缀调优:优化生成的连续提示前言摘要论文十问实验数据集模型实验结论摘要任务泛化性能 前缀调优:优化生成的连续提示 前言 大规模预训练语言模型(PLM)在下游自然语言生成任务中广泛采用fine-tuning的方法进行adaptation。但是f…

Java中各种数据类型之间的转换

低类型向高类型自动进行转换,高类型向低类型的准换会丢失数据,整数到字符类型的转换将获取对应编码的字符。 进行高精度向低精度的强制类型准换时,需要将想要转换成的数据类型加一个括号()。 如何完成自动转换呢? 转换前的数据类…

正是阶段高等数学复习--函数极限的计算

之前在预备阶段中函数极限的解决方式分三步,第一步观察形式并确定用什么方式来解决,第二步化简,化简方式一共有7种,分别是最重要的三种(等价替换、拆分极限存在的项、计算非零因子)以及次重要的4种&#xf…

Maven的安装与配置本地仓库,镜像源,环境变量详细步骤

参考视频: 黑马程序员2023新版JavaWeb开发教程,实现javaweb企业开发全流程 【小飞非系列】最新Maven实战教程-项目实战构建利器 文章目录 一.下载Maven安装包二.配置Maven的本地仓库(本机仓库)三.配置镜像源(加速jar包的下载)四.配置Maven的环…

【计算机视觉】基于OpenCV计算机视觉的摄像头测距技术设计与实现

基于计算机视觉的摄像头测距技术 文章目录 基于计算机视觉的摄像头测距技术导读引入技术实现原理技术实现细节Python-opencv实现方案获取目标轮廓步骤 1:图像处理步骤 2:找到轮廓步骤完整代码 计算图像距离前置技术背景与原理步骤 1:定义距离…

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

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

JavaWeb 添加页面和用户图像展示

add.jsp(需要登录之后才可以访问 ) -> 不是和login.jsp同级了那就 在images目录下加上默认图像 js目录下加入common.js javaWeb项目中,页面的路径 img的src form的action link的href script的src a的href推荐使用绝对路径 这个绝对路径…

图像批量设计软件Retrobatch Pro mac中文版功能特色

Retrobatch Mac是一款灵活的批量图像处理工具。用户可以自由创建Workflow来实现相应的功能,这些Workflow能取代大量的重复劳动,提高生产力。Retrobatch Mac的一般操作是从左边栏拖动相应动作到工作区形成节点(Nodes),节…

2022年9月8日 Go生态洞察:Go Developer Survey 2022 Q2 结果分析

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

动手制作个人电脑对话机器人transformers+DialoGPT

简介:DialoGPT是一个对话模型,由微软基于GPT-2训练。由于DialoGPT在对话数据上进行了预训练,所以它比原始的GPT-2更擅长生成类似对话的文本。DialoGPT的主要目标是生成自然且连贯的对话,而不是在所有情况下都提供事实上的正确答案…

解决:UnboundLocalError: local variable ‘js’ referenced before assignment

解决:UnboundLocalError: local variable ‘js’ referenced before assignment 文章目录 解决:UnboundLocalError: local variable js referenced before assignment背景报错问题报错翻译报错位置代码报错原因解决方法今天的分享就到此结束了 背景 在使…

随机森林介绍

随机森林是一种集成学习(ensemble learning)方法,通过构建多个决策树并将它们的预测结果进行组合,以产生更准确和稳定的预测结果。 随机森林的基本原理是在数据集上构建多个决策树,每个决策树都是在随机选择的观察子集…

6.8 Windows驱动开发:内核枚举Registry注册表回调

在笔者上一篇文章《内核枚举LoadImage映像回调》中LyShark教大家实现了枚举系统回调中的LoadImage通知消息,本章将实现对Registry注册表通知消息的枚举,与LoadImage消息不同Registry消息不需要解密只要找到CallbackListHead消息回调链表头并解析为_CM_NO…

TimeGPT:时序预测领域终于迎来了第一个大模型

时间序列预测领域在最近的几年有着快速的发展,比如N-BEATS、N-HiTS、PatchTST和TimesNet。 大型语言模型(llm)最近在ChatGPT等应用程序中变得非常流行,因为它们可以适应各种各样的任务,而无需进一步的训练。 这就引出了一个问题:时间序列的…

基于 Vue、Datav、Echart 框架的 “ 数据大屏项目 “,通过 Vue 组件实现数据动态刷新渲染,内部图表可实现自由替换

最近在研究大数据分析,基于 Vue、Datav、Echart 框架的 " 数据大屏项目 ",通过 Vue 组件实现数据动态刷新渲染,内部图表可实现自由替换。部分图表使用 DataV 自带组件,可进行更改,详情请点击下方 DataV 文档…

【深度学习实验】图像处理(四):PIL——自定义图像数据增强操作(图像合成;图像融合(高斯掩码))

文章目录 一、实验介绍二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 导入必要的库1. PIL基础操作2~4. 随机遮挡、随机擦除、线性混合5. 图像合成5.1 原理5.2 实现5.3 效果展示 6. 图像融合6.1 原理6.2 实现6.3 效果展示 一、实验介绍 在深度学习任务中&#xff0c…

C++实现ATM取款机

C实现ATM取款机 代码:https://mbd.pub/o/bread/ZZeZk5Zp 1.任务描述 要求:设计一个程序,当输入给定的卡号和密码(初始卡号和密码为123456) 时,系统 能登录 ATM 取款机系统,用户可以按照以下规则进行: 查询…

bean依赖属性配置

bean依赖属性配置 文章目录 bean依赖属性配置 Data ConfigurationProperties(prefix "cartoon") public class CartoonProperties {private Cat cat;private Mouse mouse; }cartoon:cat:name: whatage: 5mouse:name: howage: 6这样的话,业务bean无需在读…