redis实现异步任务队列
redis实现异步任务队列
先说思路:
将任务对象序列为JSON字符串,然后推入REDIS缓存,这叫入队。
通过独立的工作线程从REDIS拉出一个任务,这叫出队,工作线程将JSON字符串还原为任务对象,然后对这个任务对象进行处理,并取得执行结果。
整个过程是全异步执行的,所以叫异步任务队列。
下面附上演示代码。
1)任务对象定义
type
TJob = class
private
FReplyTo: String;
procedure SetReplyTo(const Value: String);
public
property ReplyTo: String read FReplyTo write SetReplyTo;
end; TEvalJob = class(TJob)
private
FExpression: String;
procedure SetExpression(const Value: String);
public
property Expression: String read FExpression write SetExpression;
end; TDatabaseJob = class(TJob)
private
FProcedureName: String;
procedure SetProcedureName(const Value: String);
public
property ProcedureName: String read FProcedureName
write SetProcedureName;
end;
2)入队
procedure TMainForm.Button1Click(Sender: TObject);
var
lRedis: IRedisClient;
lJob: TEvalJob;
lJobString: string;
begin
lRedis := NewRedisClient(REDIS_HOSTNAME); lJob := TEvalJob.Create;
try
lJob.ReplyTo := 'replies:' + FUserName;
lJob.Expression := Edit1.Text;
lJobString := TJson.ObjectToJsonString(lJob);
lRedis.LPUSH('jobs', lJobString);
finally
lJob.free;
end;
end;
3)出队并执行
procedure TMainForm.Timer1Timer(Sender: TObject);
var
lJobj: TJSONObject;
lExpression, lRes: string;
lResponse: string;
begin
if FRedis.RPOP('replies:' + FUserName, lResponse) then
begin
lJobj := TJSONObject.ParseJSONValue(lResponse) as TJSONObject;
try
lExpression := lJobj.GetValue<TJSONString>('expression').Value;
lRes := lJobj.GetValue<TJSONString>('result').Value;
Memo1.Lines.Add(Format('Response: %s = %s', [lExpression, lRes]));
finally
lJobj.free;
end;
end;
end;
redis实现异步任务队列的更多相关文章
- 异步任务队列Celery在Django中的使用
前段时间在Django Web平台开发中,碰到一些请求执行的任务时间较长(几分钟),为了加快用户的响应时间,因此决定采用异步任务的方式在后台执行这些任务.在同事的指引下接触了Celery这个异步任务队 ...
- Django使用Celery异步任务队列
1 Celery简介 Celery是异步任务队列,可以独立于主进程运行,在主进程退出后,也不影响队列中的任务执行. 任务执行异常退出,重新启动后,会继续执行队列中的其他任务,同时可以缓存停止期间接收 ...
- Swoole来实现实时异步任务队列
假如要发100封邮件,for循环100遍,用户直接揭竿而起,什么破网站!但实际上,我们很可能有超过1万的邮件.怎么处理这个延迟的问题?答案就是用异步.把“发邮件”这个操作封装,然后后台异步地执行1万遍 ...
- PHP使用swoole来实现实时异步任务队列
转载来自第七星尘的技术博客的<PHP使用swoole来实现实时异步任务队列> 关于异步任务队列 用户打开了我们的网站.他要做的就是勾选需要发邮件的代理商列表,然后把结算邮件发出去.假如我们 ...
- [Flask]celery异步任务队列的使用
Celery异步任务队列 目录结构树: 配置文件config.py: # 设置中间人地址 broker_url = 'redis://127.0.0.1:6379/1' 主main.py: impor ...
- 用swoole实现异步任务队列
应用场景如下: 假如要发100封邮件,for循环100遍,这种方法显然是不可取的. 在一些比较繁杂的业务里,我们很可能有超过1万的邮件要群发.那我们怎么处理这个延迟的问题? 答案就是用异步.把&quo ...
- Asp-Net-Core开发笔记:集成Hangfire实现异步任务队列和定时任务
前言 最近把Python写的数据采集平台往.Net Core上迁移,原本的采集任务使用多进程+线程池的方式来加快采集速度,使用Celery作为异步任务队列兼具定时任务功能,这套东西用着还行,但反正就折 ...
- Celery+redis实现异步
目录 Celery+redis实现异步 安装redis 安装celery-with-redis 添加celery相关配置 创建异步运行任务tasks.py 启动 Celery+redis实现异步 安装 ...
- c# 异步任务队列(可选是否使用单线程执行任务,以及自动取消任务)
使用demo,(.net framework 4.0 自行添加async wait 扩展库) class Program { static void Main(string[] args) { Con ...
随机推荐
- scrapy主动触发关闭爬虫
在spider中时在方法里直接写 self.crawler.engine.close_spider(self, 'cookie失效关闭爬虫') 在pipeline和downloaderMiddle ...
- tomcat报错:java.net.SocketException: Permission denied["http-nio-80"]
tomcat报错:java.net.SocketException: Permission denied["http-nio-80"] 问题:使用非root账户tomcat启动to ...
- Java环境的搭建及用记事本来揭露下JDK到底做了些什么
和我一样的新手想学Java就从自己搭建环境开始,请看完这边文章,我搜集资料的整合. Java的标准版本是Java SE,所说的JDK(Java Development Kits)就是Java SE的开 ...
- 【前端vue开发】vue开发输入姓名,电话,公司表单提交组件
<template> <div id="parti-info"> <div> <span>您的姓名:</span> &l ...
- TcxGrid 复选框
- 切换Intellij ieda 调试为Visual Studio风格
- 黑苹果 之 神舟战神Z7M-SL7D2
黑苹果引导工具 Clover 配置详解:http://www.jianshu.com/p/b156b0177a24 神舟Z7m UEFI+GPT安装WIN10+MAC OS X Yosemite双系统 ...
- Java string.valueof的用法以及与parseint的区别
一.由基本数据型态转换成String String 类别中已经提供了将基本数据型态转换成 String 的 static 方法 ,也就是 String.valueOf() 这个参数多载的方法 有以下几 ...
- 002.iSCSI服务端配置
一 iSCSI target的磁盘种类 大型文件 单一分区(partition) 磁盘 数组 RAID LVM 二 iSCSI创建步骤 建立用于共享的磁盘设备(分区/磁盘/文件) 创建后备磁盘 创建相 ...
- ubuntu18.04初始化配置
目录 ubuntu18.04初始化配置 ifconfig sshd smb other vim 配置 最后 ubuntu18.04初始化配置 虚拟机挂了, 又得重新安装配置一遍, 这里记录了我几乎每次 ...