【问题标题】:ruby resque without loading rails environment没有加载rails环境的ruby resque
【发布时间】:2011-10-17 10:19:13
【问题描述】:
我有一个 resque 工人,它工作得很好,但速度太慢了。造成这种情况的主要原因是我正在使用 activerecord 并且必须加载整个环境,这至少需要 10-20 秒才能加载(我不会一直保持运行的工作人员,因为我正在使用 Heroku 并付款工人运行的时间)。我正在使用 resque worker 从外部网站获取和解析数据,然后将数据转储到我的数据库中。
我的问题是我是否应该重写方法以不使用 Rails 而是使用 DataMapper?或者其他比activerecord加载速度更快的东西。
或者如果我应该提取代码(使用 ActiveRecord)来确定如何处理外部数据并将其移出工作人员并返回到应用程序中?
希望这是有道理的。
【问题讨论】:
标签:
ruby-on-rails-3
activerecord
redis
datamapper
resque
【解决方案1】:
我也有同样的问题。
你可以在 rake resque:setup rake 任务上设置你的环境
我试过这个。假设我的 rake resque 任务在 lib/tasks/resque.rake
require "resque/tasks"
task "resque:setup" do
root_path = "#{File.dirname(__FILE__)}/../.."
db_config = YAML::load(File.open(File.join(root_path,'config','database.yml')))["development"]
ActiveRecord::Base.establish_connection(db_config)
require "#{root_path}/app/workers/photo_downloader.rb" #workers
#Dir.glob("#{root_path}/app/models/*").each { |r| puts r; require r } #require all model
require "#{root_path}/app/models/photo.rb" # require model individually
end
我还没有完全成功,因为我使用的是需要 rails 环境的 Paperclip gem
【解决方案2】:
Rails 的引导程序真的很慢;它旨在保持运行,直到特定时间重新启动(以消除一些内存泄漏,很可能是,任何软件都不是没有错误的),并且不打算用作为一个请求而启动的站点,并且然后关机。
这种用法更像是脚本。如果您需要使用浏览器启动它,您可以轻松地使用 Erubis 之类的东西来编写页面并在脚本中使用 ActiveRecord(我认为它可以在 Rails 之外使用)或类似的抽象层。我自己,对于小任务,我只使用Mysql2。
【解决方案3】:
在没有 Rails 应用程序的情况下使用 bundler 获取 active_record 和其他 gem。
require 'rubygems'
require 'logger'
require 'active_record'
require 'bundler'
require "active_support"
require "spreadsheet"
require 'net/ping'
require 'net/http'
Bundler.setup
Bundler.require(:default) if defined?(Bundler)
$config_logger = Logger.new("./log/dev.log")
class Dbconnect
def initialize
@settings = YAML.load_file('./config/database.yml')["development"]
@adapter = @settings["adapter"] if @settings["adapter"]
@database = @settings["database"] if @settings["database"]
@pool = @settings["pool"] if @settings["pool"]
@timeout = @settings["timeout"] if @settings["timeout"]
end
def connect_to_db
ActiveRecord::Base.establish_connection(
:adapter => @adapter,
:database => @database,
:reconnect => @reconnect,
:pool => @pool,
:timeout => @timeout)
$config_logger.info "\n db Connected: to => #{@database} "
end
end
end
}
Example Gemfile :
source "http://rubygems.org"
gem 'mail'
gem "escape_utils"
gem 'json',:require => "json"
gem 'json_pure'
gem 'resque'
gem 'resque-scheduler'
gem 'redis-namespace'
gem 'resque-status'
gem 'rake'
gem 'em-udns'
gem 'sqlite3'
gem 'spreadsheet'
gem 'activerecord', '3.2.1', :require => "active_record"
gem 'net-scp', :require => 'net/scp'
gem 'net-sftp', :require => 'net/sftp'
gem 'net-ssh', :require => 'net/ssh'
gem 'dir'
gem 'amatch'
gem 'haml'
gem 'net-ping'
gem install bundler
剩下的事情:捆绑安装。