Rails cast上有关于介绍Delayed job的使用范例的:使用delayed job处理一个异步发送邮件的任务。我没仔细看。然后自己弄了起来。记录过程如下,希望给后来者提供一些帮助。
首先介绍下应用场景:在WEB应用中,系统执行某些任务时,可能执行结果比较长,并且不需要及时把结果反馈给用户。这样我们就需要将这些处理时间长的请求剥离成异步处理,及时响应页面的请求。比如Rails cast中示例的发邮件。可能发邮件需要2到10秒钟不等。这个请求如果采用同步处理,会让用户觉得卡了一下的感觉,体验不好。如果采用异步处理,只需要记录需要处理这个任务,然后将任务记录在某个地方,再由后台程序去调度执行这些任务,这样就可以在极短时间(如果其他代码没有问题)内给用户反馈信息,这样体验就会好很多。
我的应用场景是:一个用例在修改名称后,需要将名称同步到脚本相关的Excel中。修改Excel的过程比较长,至少会有3秒以上。这样就需要将这个修改异步出去。我的环境是ruby ee + Rails 3 + Mysql。
在github上搜索delayed job。可以得到好多个分支的delayed job插件。collectiveidea 分支的不错,可以自动建立migration和script任务。
原理如下:在Object对象上扩展了一个delay方法。如果遇到任何需要异步处理的函数,就使用对象.delay.方法名。比如正常代码为:Mail.send_mail(@mail) ,异步处理即为:Mail.delay.send_mail(@mail)。delay函数中利用ruby的动态性,即将send_mail方法异步调用:先写入到数据库的表delayed_jobs,生成一条记录,worker进程会每隔5秒去检查一下数据库这张表的记录,如果有记录就去读取出来处理掉,然后再删除记录。有点像消息队列的处理机制。废话完毕,开干~~~
1、在Gemfile里面配置:gem 'delayed job'。然后在工程目录下执行:sudo bundle install
2、执行ruby script/generate delayed_job 。会创建Model和Migration。执行rake db:migration即可建立数据库表。
3、启动worker:ruby scrpt/delayed_job。这个进程就是去定时读取数据库任务的。
4、在需要处理的函数上都加上.delay.方法名。
大功告成。
有个小问题需要注意:Rails中启动应用会有不同的环境,为了让delayed_job这个worker找到正确的数据库,需要设置系统的环境变量,执行:export RAILS_ENV=online_production 。这样再启动delayed job的worker进程时,就会去读取online_production对应的数据库。
delayed_job值得提及的特性就是自动重试功能。如果一个方法抛出了异常,这个异常会被捕获,之后这个方法将会重新运行。这个过程最多重复25次,次数越多重试的时间间隔就越长。
在分布式中,worker进程只需要启动一个即可。不需要每个机器都启动worker去读取数据库的任务去执行。在异步任务不是太多时,一个进程完全够用。并且,时间瓶颈也并非在一个进程还是在两个进程上,主要还是在处理异步任务的代码上。另外,需要说明的是,worker启动时可以指定多个实例。还有其他一些参数,运行:ruby script/delayed_job可以看到帮助。
转载自:http://www.myexception.cn/ai/844431.html
相关推荐
为了解决这个问题,ASP.NET 提供了异步处理机制,允许Web服务器在等待任务完成时可以处理其他请求,提高了系统的并发性和资源利用率。 本项目"ASP.NET大任务异步处理的实现"是基于C#编程语言实现的,C# 5.0及以上...
这种方式允许代码在不阻塞主线程的情况下进行异步处理,从而保持用户界面的响应性。 "TeaDelegate"这个名字可能是一个特定的委托类型,通常在.NET Framework或C#编程中,委托是一种引用方法的类型,可以用来实现...
同步方法和异步方法的核心区别在于处理任务的方式。 **同步方法**: 同步方法在调用后会阻塞主线程,直到方法执行完毕并返回结果。这意味着在方法执行期间,程序无法执行其他任何操作。例如,如果你有一个耗时的...
`await`使异步代码更加简洁和易于理解,`Task.WhenAll()`允许我们并行处理多个任务,而`Task.Delay()`提供了无阻塞的延时操作,优化了资源利用。通过理解和巧妙地运用这些工具,开发者可以编写出高效、响应式的应用...
这个“C# 异步 返回值例子”很可能是展示如何在异步方法中处理返回值的一个示例。 在C#中,异步编程主要通过`async`和`await`关键字实现。`async`关键字标记一个方法为异步,而`await`关键字用于等待一个异步操作的...
在前端开发中,异步控制和时间延迟处理是常见的需求,尤其在进行动画效果、模拟网络延迟或测试场景时。`await-delay` 是一个专为前端开发者设计的开源库,它提供了一种简单的方式来实现延迟操作,使得代码更加优雅且...
异步调用的使用场景广泛,例如在Web开发中,处理HTTP请求、数据库查询、文件读写等I/O密集型操作。在这些场景下,异步调用可以极大地提高服务器的并发能力,减少用户等待时间。 总结起来,异步调用是现代软件开发中...
在本篇讨论中,我们将深入探讨Celery的核心概念、安装、配置以及如何在Python应用中使用它进行异步任务处理。 **1. Celery的核心概念** Celery主要由以下几个关键组件构成: - **任务(Task)**:这是你需要异步...
5. **Entity Framework异步数据库访问**:在使用Entity Framework进行数据访问时,可以使用`async`和`await`来实现数据库查询的异步处理,避免阻塞数据库连接。 6. **Task.Run()和Task.Delay()**:在某些情况下,...
使用 `delay` 函数可以实现延迟执行,而 `timeout` 则可以为异步操作设置超时,防止程序因为某个操作卡住。 6. **错误处理**: 在异步编程中,错误处理是关键。Async.js 提供了一个 `tryCatch` 高阶函数,可以...
综上所述,这个VB项目提供了一种替代`Sleep`函数的延迟执行方案,通过使用`Delay`函数,程序可以保持响应性,同时实现延迟操作,这对于需要处理用户交互或并发任务的程序来说尤其重要。通过`clswaitabletimer`类,...
send_verification_email.delay(instance.id) # 使用Celery的delay方法异步执行 ``` 6. **运行Celery worker**:启动Celery工作进程,以便它可以接收和执行任务。在命令行中运行`celery -A your_project_name ...
var id = setTimeout(fn, delay); – 初始化一个计时器,然后在指定的时间间隔后执行。该函数返回一个唯一的标志ID(Number类型),我们可以使用它来取消计时器。 var id = setInterval(fn, delay); – 和setTimeout...
C# 5.0引入了异步编程模型,使得开发者能够更轻松地处理非阻塞操作,如网络请求或I/O密集型任务。本篇将深入探讨"异步编程超时取消并返回结果"这一主题,以及如何在C#中实现这一功能。 首先,异步编程的核心在于`...
Task task = Task.Delay(5000, cts.Token); // 取消任务 cts.Cancel(); ``` 七、`Task`的状态 `Task`有多种状态,如`Created`、`Running`、`Canceled`、`Faulted`和`RanToCompletion`,这些状态可以通过`Task....
这个"delay10"程序的实现可能还会涉及其他细节,比如考虑电源复位(power-on reset)条件、同步复位(synchronous reset)以及可能的同步和异步信号处理。同时,为了优化资源使用,可能会使用更复杂的计数器结构,如...
因此,异步处理是解决这一问题的关键。 首先,我们需要创建一个新的窗体(如Form1),它将作为我们的等待框。这个等待框可以包含一个进度条、一个标签来显示消息,以及一个取消按钮(如果需要的话)。窗体的加载...
本教程将详细讲解如何利用ViewPager结合异步加载技术来创建一个图片自动切换的功能。 首先,我们需要了解ViewPager的基本用法。ViewPager允许用户在多个视图之间进行水平滑动,每个视图代表一个页面。它通过...
为解决这个问题,通常使用时钟域转换电路,如DFF(D flip-flop)或者DLL(Delay Locked Loop)来确保数据在正确的时间被采样。 在FPGA设计中,实现异步FIFO有多种方法,其中最常用的是采用双口RAM。双口RAM允许同时...
在大规模异步设计中,这样的基本单元数量庞大,因此在后仿真时,需要有效地管理SDF反标,可以将这些寄存器封装到单独的模块中,如Sync2FF模块,以简化处理。 然而,基本sync单元存在一些潜在问题。其中之一是在...