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 ...
随机推荐
- CyberArticle(eLib电子图书馆)网文快捕
CyberArticle (网文快捕)是一款知识管理软件,主要致力于网页的保存和后期管理.CyberArticle (网文快捕)主要功能,就是收集和整理网页.利用CyberArticle (网文快捕) ...
- xunsearch 迅搜初探
2014年1月2日 19:34:12 [root@localhost bin]# ./php /usr/local/lamp/xunsearch/sdk/php/util/Quest.php demo ...
- PHP时间戳和日期转换
获取当前时间 <?php var_dump(time()); //获取当前时间戳 int(1502245603) 时间戳转换为时间,可以用date(‘Y-m-s h:i:s’, 具体时间戳来实现 ...
- CF601A 【The Two Routes】
看数据范围,然后果断邻接矩阵$Floyd$啊 对于公路和铁路,各建一个图,分别跑最短路,然后取最大值即可 #include<iostream> #include<cstdio> ...
- (三)发布Dubbo服务
我们现在来学习下发布Dubbo服务,主要参考dubbo开发包里的demo源码:由浅入深的讲解下这个小demo: github地址:https://github.com/apache/incubator ...
- pathon 基础学习-集合(set),单双队列,深浅copy,内置函数
一.collections系列: collections其实是python的标准库,也就是python的一个内置模块,因此使用之前导入一下collections模块即可,collections在pyt ...
- Linix下修改mysql服务器编码
1. 找到mysql的配置文件,拷贝到etc目录下,第一步很重要 把/usr/share/doc/mysql-server-5.1.52/my-large.cnf 复制到 /etc/my.cnf 即用 ...
- [转] offsetParent 到底是哪一个?
正文 不同情况 没有已定位的父节点,且自身position:relative的DIV元素的offsetParent为BODY 没有已定位的父节点,且自身position: absolute的DIV元素 ...
- bzoj 1178 [Apio2009]CONVENTION会议中心
这题好难啊! 我好菜啊! 思路:对于最多线段不相交, 我们可以按左端点sort之后,贪心取. 但是这个题要求选取的线段排序之后序号的字典序最小. 那么我们如果按序号贪心地从大往小往里放, 那么对于第k ...
- cos,sina,tan,cot
这些都是三角形的公式. 三角形总之就是一个直角两个锐角. cos就是余弦定理,就是锐角的邻边除以三角形的斜边. sin就是正弦定理,就是锐角的对边除以三角形的斜边. tan就是正切定理,就是锐角的对边 ...