gpt4 book ai didi

ruby-on-rails - Rake 任务和 Rails 初始化程序

转载 作者:行者123 更新时间:2023-12-04 06:22:56 26 4
gpt4 key购买 nike

Rails 有点新,所以请应付我。我现在正在做的是后台处理一些 Ruby 代码使用 Resque。为了启动 Rescque rake 任务,我一直在使用(在 heroku 上),我有一个 resque.rake 文件,其中包含推荐的代码以附加到 heroku 神奇的(或奇怪的)线程架构中:

require "resque/tasks"
require 'resque_scheduler/tasks'

task "resque:setup" => :environment do
ENV['QUEUE'] = '*'
end


desc "Alias for resque:work (To run workers on Heroku)"
task "jobs:work" => "resque:work"

因为我需要访问 Rails 代码,所以我引用了 :environment。如果我在 heroku 的后台设置至少 1 个 worker dyno,我的 Resque 会很好,被清除,一切都很开心。直到我尝试自动化的东西...

所以我想改进代码,每分钟左右自动用相关任务填充队列。这样做(不使用 cron,因为 heroku 不能满足 cron 的要求),我声明了一个名为 task_scheduler.rb 的初始化程序,它使用 Rufus 调度程序来运行任务:

scheduler = Rufus::Scheduler.start_new

scheduler.in '5s' do
autoprocessor_method
end

scheduler.every '1m' do
autoprocessor_method
end

有一段时间事情似乎工作得很好......然后 rake 进程莫名其妙地停止从队列中拾取。队列变得越来越大。即使我有多个 worker dynos 正在运行,他们最终都会感到疲倦并停止处理队列。我不确定我做错了什么,但我怀疑在我的 rake 任务中引用 Rails 环境导致 task_scheduler.rb 代码再次运行,导致重复调度。我想知道如果有人知道如何解决这个问题,我也很好奇这是否是 rake 任务停止工作的原因。

谢谢

最佳答案

你不应该在初始化程序中启动调度程序,你应该有一个守护进程运行调度程序并填充你的队列。它会是这样的(“脚本/调度程序”):

#!/usr/bin/env ruby

root = File.expand_path(File.join(File.dirname(__FILE__), '..'))
Dir.chdir(root)

require 'rubygems'
gem 'daemons'
require 'daemons'

options = {
:dir_mode => :normal,
:dir => File.join(root, 'log'),
:log_output => true,
:backtrace => true,
:multiple => false
}

Daemons.run_proc("scheduler", options) do

Dir.chdir(root)
require(File.join(root, 'config', 'environment'))

scheduler = Rufus::Scheduler.start_new

scheduler.in '5s' do
autoprocessor_method
end

scheduler.every '1m' do
autoprocessor_method
end

end

您可以从您的应用中将此脚本作为普通守护进程调用:

script/scheduler start

这将确保您只有 一个 进程为 resque worker 发送工作,而不是为您正在运行的每个 mongrel 发送一个进程。

关于ruby-on-rails - Rake 任务和 Rails 初始化程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6803344/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com