我可以在Rails应用程序中启动和停止delayed_job工作程序吗?

时间:2009-11-12 20:52:41

标签: ruby-on-rails delayed-job

我有一个可以从delayed_job和一些后台处理中受益的应用。问题是,我并不需要/希望delayed_job工作人员一直在运行。

该应用程序在共享托管环境和多个位置(针对不同用户)运行。此外,该应用程序没有获得大量使用。

有没有办法在某些操作/事件之后从我的应用程序启动和停止处理作业(使用脚本或rake任务)?

4 个答案:

答案 0 :(得分:5)

你可以呼叫系统:

system "cd #{Rails.root} && rake delayed_job:start RAILS_ENV=production"

您可以更改delayed_job以更少检查。而不是5秒默认值,将其设置为15分钟或其他。

答案 1 :(得分:0)

是的,你可以,但我不确定它会带来什么好处。你说你不希望工人一直在跑步 - 你有什么顾虑?内存使用情况?数据库连接?

为了将delayed_job的影响保持在系统的低位,我只运行一个工作程序,并将其配置为大部分时间处于休眠状态。

Delayed::Worker::sleep_delay = 60 * 5  # in your initializer.rb

单个工作人员只会每隔5分钟醒来并检查数据库是否有新工作。以这种方式运行可以使您免于“定制”。

但是,如果确实想以编程方式启动Delayed::Worker,请查看该类work_off,并实现自己的script/run_jobs_and_exit脚本。它应该看起来很像script/delayed_job - 3行。

答案 2 :(得分:0)

我发现这是因为我正在寻找一种方法来运行一些后台工作,而不需要花费所有的钱来在不需要时一直运行它们。有人使用谷歌应用程序引擎来运行后台作业:

http://viatropos.com/blog/how-to-run-background-jobs-on-heroku-for-free/

虽然有点过时了。线程中有一个有趣的评论:

“当我需要发送电子邮件,复制文件等时,我基本上将它添加到队列中。在每个请求结束时,它会检查队列中是否有任何内容。如果是,那么它使用Heroku用于将worker设置为1的API。在完成任务的worker的末尾,它检查队列中是否还有任何内容。如果没有,则将worker设置为0.最终结果是后台worker将在这里和那里工作几秒钟。我可以完成我需要的所有后台处理工作,月底的账单很少能达到1小时的总工作量。即使没有问题,我也会支付0.05美元用于后台处理。:)“

答案 3 :(得分:0)

如果你去阻止一个工人,你会获得PID。如果其他所有方法都失败,你可以简单地杀死-9 PID。