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 ...
随机推荐
- Docker手动搭建sentry错误日志系统
Sentry介绍 在开发过程中,我们通过debug来排查bug,并且使用logging来记录系统的错误.但是logging有很多不足: 必须登陆到服务器查看日志文件 需要主动去查询 输出日志方式无法把 ...
- jquery-扩展
jQuery扩展三种方式:$.extend,$.fn.extend,外部文件. 1)jQuery.extend(object) 调用 $.方法 2)jQuery.fn.extend(object) ...
- 如何写django中form的测试用例
可简可繁, 可插库,可字符, 要测试valid,也要测试invalid, 可用csrf,也可用context. 放一个全面的, 实践中,找一个最优的组合就好. class NewTopicTests( ...
- 插件bootstrap-table
基于Metronic的Bootstrap开发框架经验总结(16)-- 使用插件bootstrap-table实现表格记录的查询.分页.排序等处理 在业务系统开发中,对表格记录的查询.分页.排序等处理是 ...
- 【AtCoder】AtCoder Petrozavodsk Contest 001
A - Two Integers 如果\(X\)是\(Y\)的倍数的话不存在 可以输出\(X \cdot (\frac{Y}{gcd(X,Y)} - 1)\) 代码 #include <bits ...
- 【Java】 大话数据结构(6) 栈的顺序与链式存储
本文根据<大话数据结构>一书,实现了Java版的栈的顺序存储结构.两栈共享空间.栈的链式存储机构. 栈:限定仅在表尾进行插入和删除操作的线性表. 栈的插入(进栈)和删除(出栈)操作如下图所 ...
- 001.NFS简介
一 简介 NFS 是Network File System的缩写,即网络文件系统.一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布.功能是通过网络让不同的机器.不同的操作系统能够 ...
- Chart.js Y轴数据以百分比展示
新手一枚,解决的问题喜欢记录,也许正好有人在网上迷茫的百度着.-0- 最近使用Chart.js做折线图的报表展示,直接显示整数啥的很好弄毕竟例子直接在哪里可以用,百分比就没办法了.百度慢慢汲取营养,虽 ...
- 使用Synchronized块同步变量
我们可以通过synchronized块来同步特定的静态或非静态方法.要想实现这种需求必须为这些特定的方法定义一个类变量,然后将这些方法的代码用synchronized块括起来,并将这个类变量作为参数传 ...
- Javascript实现一个插件
写一个插件,兼容commonjs,amd,cmd,原生js. ;(function (global, factory) { if(typeof define == 'function' &&a ...