【发布时间】:2010-12-16 01:37:33
【问题描述】:
我有一个可以从延迟作业和一些后台处理中受益的应用。问题是,我真的不需要/想要延迟工作的工作人员一直在运行。
该应用在共享托管环境和多个位置(针对不同用户)中运行。另外,该应用程序的使用量并不大。
只有在某些操作/事件发生后,有没有办法从我的应用程序开始和停止处理作业(使用脚本或 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 将 worker 设置为 1。在 worker 完成任务后,它会检查队列中是否还有任何内容。如果没有,则将 worker 设置回 0。最终结果是后台 worker 将在这里和那里工作几秒钟。我可以完成我需要的所有后台处理,而月底的账单很少达到 1 小时的总工作量。即使没有问题,我也会付钱后台处理 $0.05。:)"
【讨论】:
如果你去阻止一个工人,你会得到 PID。如果一切都失败了,你可以简单地杀死 -9 PID。
【讨论】: