Ruby on rails 3 不加载rails环境的ruby resque
我有一个resque工人,工作很好,但太慢了。这样做的主要原因是我使用activerecord,并且必须加载整个环境,加载至少需要10-20秒(我不会在使用Heroku时一直让工作人员运行,并为工作人员的运行时间付费)。我正在使用resque worker从外部网站抓取和解析数据,然后将数据转储到我的数据库中 我的问题是,我是否应该重写该方法,不使用Rails,而是使用DataMapper?或者其他比activerecord加载更快的东西 或者,我是否应该提取代码(使用ActiveRecord),以确定如何处理外部数据,并将其移出worker并返回到应用程序中Ruby on rails 3 不加载rails环境的ruby resque,ruby-on-rails-3,activerecord,redis,datamapper,resque,Ruby On Rails 3,Activerecord,Redis,Datamapper,Resque,我有一个resque工人,工作很好,但太慢了。这样做的主要原因是我使用activerecord,并且必须加载整个环境,加载至少需要10-20秒(我不会在使用Heroku时一直让工作人员运行,并为工作人员的运行时间付费)。我正在使用resque worker从外部网站抓取和解析数据,然后将数据转储到我的数据库中 我的问题是,我是否应该重写该方法,不使用Rails,而是使用DataMapper?或者其他比activerecord加载更快的东西 或者,我是否应该提取代码(使用ActiveRecord)
希望这是有道理的 Rails的引导速度非常慢;它的目的是保持运行,直到重新启动的某个时间(为了消除某些内存泄漏,最有可能的情况是,任何软件都不是无bug的),并且不打算用作一个站点,该站点在一个请求启动后关闭 这种用法更像是脚本。如果您需要使用浏览器启动它,您可以很容易地使用诸如编写页面和在脚本中使用ActiveRecord之类的东西(我认为它可以在rails之外使用)或类似的抽象层。我自己,对于小任务,我只是使用。我也有同样的问题。 您可以在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环境的回形针gem使用bundler在没有rails应用程序的情况下为您获取活动记录和其他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
剩下的事情:捆绑安装