繁体   English   中英

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

[英]Can I start and stop delayed_job workers from within my Rails app?

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

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

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

你可以呼叫系统:

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

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

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

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

为了保持delayed_job对系统的影响较小,我只运行一个worker,并将其配置为大部分时间处于休眠状态。

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来设置在一个完成任务的工人结束时,它检查队列中是否还有任何东西。如果没有,那么它将工人设置回0。最终结果是后台工作人员将为在这里和那里几秒钟。我可以完成我需要的所有后台处理,月底的账单很少能达到1小时的总工作量。即使没有问题,我还要支付0.05美元的背景费用。处理。:)“

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM