红宝石resque没有加载rails环境

时间:2011-08-01 12:36:05

标签: ruby-on-rails-3 activerecord redis datamapper resque

我有一个resque工作人员工作得很好但是太慢了。造成这种情况的主要原因是我使用的是activerecord并且必须加载整个环境,这只需要加载至少10-20秒(因为我使用Heroku并付费,所以我不会一直保持正在运行的工作人员在工人跑的时候)。我正在使用一名resque工作人员来抓住&从外部网站解析数据,然后将数据转储到我的数据库中。

我的问题是我是否应该重写方法不使用Rails而是使用DataMapper?或者其他比loadladord更快加载的东西。

或者如果我应该提取代码(使用ActiveRecord),该代码会弄清楚如何处理外部数据并将其移出工作人员并返回应用程序?

希望这是有道理的。

3 个答案:

答案 0 :(得分:4)

我有同样的问题。 您可以在rake resque上设置环境:setup rake task

我试过这个。假设我的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

答案 1 :(得分:3)

Rails的bootstrap真的很慢;它应该保持运行,直到重新启动一定时间(消除一些内存泄漏,最有可能的是,任何软件都没有错误),并且不打算用作为一个请求启动的站点。然后关闭。

这种用法更类似于脚本。如果您需要使用浏览器启动它,您可以轻松地使用类似Erubis的内容来编写页面并在脚本中使用ActiveRecord(我认为它可以在rails之外使用)或类似的抽象层。我自己,对于小任务,我只使用Mysql2

答案 2 :(得分:-1)

使用bundler来获取active_record和其他gem,而无需使用rails应用程序。

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

剩下的事情:捆绑安装。