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 ...
随机推荐
- poj1273
赤裸裸的最大流 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstr ...
- css-实现图标在输入框中显示
一:JavaScript 是脚本语言 JavaScript 是一种轻量级的编程语言. JavaScript 是可插入 HTML 页面的编程代码. JavaScript 插入 HTML 页面后,可由所有 ...
- NET-知识点:C#中Equals和==比较
第一.相等性比较 其实这个问题的的本质就是C#的相等比较,相等比较可以分两类: 1.引用相等性,引用相等性指两个对象引用均引用同一基础对象. 2.值相等性,值相等性指两个对象包含相同的一个或多个值,其 ...
- 《NodeJS开发指南》第五章微博实例开发总结
所有文章搬运自我的个人主页:sheilasun.me <NodeJS开发指南>这本书用来NodeJS入门真是太好了,而且书的附录部分还讲到了闭包.this等JavaScript常用特性.第 ...
- react 15
react 15 最近项目由react0.14.X升级到react 15版本,因为react15还是做了一些相对大一点的更新的(详情可以参考一下我的另一篇文章关于react15的一点总结),相对:来说 ...
- Harbor 企业级镜像仓库搭建
Habor是由VMWare公司开源的容器镜像仓库.事实上,Habor是在Docker Registry上进行了相应的 企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括:管理用户界面,基于角 ...
- js数据结构之列表的详细实现方法
* 列表用于存放数据量较少的数据结构* 当数据量较大时,不需要对其进行查找.排序的情况下,使用列表也比较方便. 本数据结构在node环境下运行,需要对node有个基本是了解. 1. listSize: ...
- WEP自动破解工具wesside-ng
WEP自动破解工具wesside-ng wesside-ng是aircrack-ng套件提供的一个概念验证工具.该工具可以自动扫描无线网络,发现WEP加密的AP.然后,尝试关联该AP.关联成功后, ...
- Wannafly挑战赛21A
题目链接 Wannafly挑战赛21A 题解 代码 #include <cstdio> #include <cmath> #define MAX 1000005 #define ...
- BZOJ.2716.[Violet3]天使玩偶(CDQ分治 坐标变换)
题目链接 考虑对于两个点a,b,距离为|x[a]-x[b]|+|y[a]-y[b]|,如果a在b的右上,那我们可以把绝对值去掉,即x[a]+y[a]-(x[b]+y[b]). 即我们要求满足x[b]& ...