我有一个可以从延迟作业和一些后台处理中受益的应用程序。问题是,我真的不需要/想要延迟工作的工作人员一直在运行。
该应用程序在共享托管环境和多个位置(针对不同用户)中运行。另外,该应用程序的使用量并不大。
有没有办法仅在某些操作/事件之后从我的应用程序开始和停止处理作业(使用脚本或 rake 任务)?
我有一个可以从延迟作业和一些后台处理中受益的应用程序。问题是,我真的不需要/想要延迟工作的工作人员一直在运行。
该应用程序在共享托管环境和多个位置(针对不同用户)中运行。另外,该应用程序的使用量并不大。
有没有办法仅在某些操作/事件之后从我的应用程序开始和停止处理作业(使用脚本或 rake 任务)?
您可以调用系统:
system "cd #{Rails.root} && rake delayed_job:start RAILS_ENV=production"
您也可以更改 delay_job 以减少检查频率。代替默认的 5 秒,将其设置为 15 分钟或其他时间。
是的,你可以,但我不确定会有什么好处。你说你不希望工人一直在运行——你有什么顾虑?内存使用情况?数据库连接?
为了降低延迟作业对您系统的影响,我只运行一名工作人员,并将其配置为大部分时间处于休眠状态。
Delayed::Worker::sleep_delay = 60 * 5 # in your initializer.rb
单个工作人员只会每 5 分钟醒来并检查数据库中的新作业。以这种方式运行可以防止您过多地“定制”。
但是,如果您真的想以Delayed::Worker
编程方式启动,请在该类中查找work_off
,并实现您自己的script/run_jobs_and_exit
脚本。它可能看起来很像script/delayed_job
- 3 行。
我发现这个是因为我正在寻找一种方法来运行一些后台作业,而无需花费所有的钱在不需要的时候一直运行它们。有人使用谷歌应用引擎进行了黑客攻击以运行后台作业:
http://viatropos.com/blog/how-to-run-background-jobs-on-heroku-for-free/
不过它有点过时了。线程中有一个有趣的评论:
“当我需要发送电子邮件、复制文件等时,我基本上将其添加到队列中。在每个请求结束时,它会检查队列中是否有任何内容。如果有,那么它使用 Heroku API 来设置工人为1。在工人完成任务结束时,它检查队列中是否还有任何东西。如果没有,则将工人设置回0。最终结果是后台工人将只为在这里和那里几秒钟。我可以完成我需要的所有后台处理,而月底的账单很少达到 1 小时的总工作价值。即使没有问题,我也会支付 0.05 美元的后台费用加工。 :)”
如果你去阻止一个工人,你会得到 PID。如果一切都失败了,你可以简单地杀死 -9 PID。