处理非常长时间运行的rake任务

时间:2012-03-26 17:59:26

标签: ruby-on-rails rake delayed-job rake-task

我感兴趣的是运行一个非常长时间的rake任务,这个任务需要几个小时才能完成,我有兴趣了解处理这个问题的最佳实践。

我找到了可能的解决方案:

  1. 设置cron作业
  2. delayed_job
  3. resque
  4. cron似乎是一个简单的设置解决方案,但它是否适合长期任务?您使用什么以及您的解决方案的优点/缺点是什么?

2 个答案:

答案 0 :(得分:30)

我个人喜欢Resque,你可以使用resque-scheduler gem处理长时间运行或定期任务。

如果您不必经常运行任务,则可以将rake任务妖魔化,以确保在SSH会话死亡或其他情况下它继续运行。

尝试这样的事情:

nohup rake my:task &

nohup会将输出发送到您运行任务的目录中的nohup.out,并且还会离开您的ssh会话而不会使进程死亡,其次&会运行它作为一个守护神。

答案 1 :(得分:1)

在我创建的一个应用程序中,用户可以上传在上传时缩略图的PDF以创建预览图像。由于PDF可能非常大,缩略图可能需要一段时间,并且必须在后台运行。为此,我使用了

  • Paperclip用于上传,
  • delayed_paperclip宝石将缩略图移交给后台进程,
  • Resque,由Redis支持,用于处理工作队列,
  • God宝石,启动Redis和Resque工作人员并监控整个shebang。

从好的方面来说,你可以获得漂亮的Resque GUI来查看你的工作人员,并且你有上帝在那里观察(并杀死并重新启动)失控过程(这些过程往往会发生很多“在ImageMagick中处理PDF文件”,使整个过程更加稳定可靠。

从负面来看,设置比cron工作要困难得多。但是让cron运行一个长期的,内存密集型的进程不受监控似乎对我来说是一种灾难。

希望有所帮助!