2015-06-05 3 views
3

У меня очень большое приложение для рельсов, и я прочитал каждое сообщение о том, как уменьшить время загрузки, каждый из которых предлагает сократить инструменты или контроллеры или драгоценные камни, но все они используются ,приложение для загрузки больших рельсов

Проблема, с которой я столкнулся, заключается в том, что героику толкает код ошибки R10, так как мое приложение занимает более 60 секунд для загрузки.

Я пробовал одно, почти успешно. Я пытаюсь запустить Bundler.require и Application.inialize! в потоках (последний поток ожидает первого завершения). Преимущество этого заключается в том, что тонкий сервер загружается почти мгновенно.

Проблема заключается в том, что когда кто-то обращается к приложению с запросом, процесс инициализации остается неполным. Любая идея, как я могу это достичь?

+0

Можете ли вы уточнить, что «процесс инициализации остается неполным»? Вы имеете в виду, что инициализация просто не завершается? Или некоторая «инициализированная» переменная не установлена? Вы получаете сообщение об ошибке? –

ответ

0

Вы можете взять управление процессом инициализации, расширив метод initialize! в config/application.rb.

Посмотрите на это sample application.rb file из проекта github. Вы должны иметь возможность расширить метод initialize! внутри области class Application < Rails::Application.

Вы можете использовать базовые методы из Rails Initialization docs в разделе 2.3 railties/lib/rails/application.rb. Итак, вот что вы будете иметь, если вы расширите методы и оставьте их по мере их реализации по умолчанию.

class Application < Rails::Application 
    def initialize!(group=:default) #:nodoc: 
    raise "Application has been already initialized." if @initialized 
    run_initializers(group, self) 
    @initialized = true 
    self 
    end 

    def run_initializers(group=:default, *args) 
    return if instance_variable_defined?(:@ran) 
    initializers.tsort_each do |initializer| 
     initializer.run(*args) if initializer.belongs_to?(group) 
    end 
    @ran = true 
    end 
end 

На этом этапе вы можете добавить заявления печати и определить, на какую часть вы застряли. Например, ваша переменная @initialized никогда не установлена ​​на true? Если да, то почему? Возможно, вы застреваете внутри run_intializers. Если это так, то какой инициализатор вы застреваете внутри?

-1

Я понял, что я пытаюсь сделать, это невозможно. Так что я заканчиваю поток.

Что я делаю: В моей environment.rb,

def init_bundler 

    # If you want your assets lazily compiled in production, use this line 
    s = Time.now 
    _rails_groups = (ENV["RAILS_GROUPS"]||"").split(",") 
    if _rails_groups.length == 1 and _rails_groups.first.to_s == "assets" 
    Bundler.require(:assets) #load ONLY assets .. 
    elsif _rails_groups.length == 1 and _rails_groups.first.to_s == "clock" 
    Bundler.require(:clock) #load ONLY assets .. 
    else 
    Bundler.require(:default, *_rails_groups, Rails.env.to_s) 
    end 
    puts "bundler required in #{Time.now - s}s" 
end 

puts "starting t1" 
$_t1 = Thread.new{ init_bundler } 

В моей environment.rb:

def init_app 
    # Initialize the rails application 
    puts "initialize started" 
    s = Time.now 
    Hedgepo::Application.initialize! 
    puts "initialize done in #{Time.now - s}s" 

end 

puts "starting t2" 
$_t2 = Thread.new do 
    loop do 
    if defined?($_t1) and !$_t1.status 
     init_app 
     break 
    else 
     puts "waiting for bundler" 
    end 
    sleep(1) 
    end 
end 

Промежуточное программное обеспечение я использую выше всех остальных:

class MyInit 
    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    loop do 
     if defined?($_t2) and !$_t2.status 
     break 
     else 
     puts "waiting for app init to finish...." 
     end 
     sleep(1) 
    end 
    @app.call(env) 
    end 
end 

Но проблема в том, что Rack :: Server выделяет переменную «app» и .start! S сервер, когда хит приходит. Итак, что бы я ни делал, я не могу изменить приложение, которое было инициализировано ДО выше, если эта переменная @app была заполнена.

+0

Вы можете переопределить любой процесс, который вы хотите, это Ruby, это его красота. Все, что вам нужно сделать, это выяснить, где назначается '@ app', и расширять метод, как это было в моем ответе. Очень просто взять под контроль эти функции инициализации. –

+0

Кроме того, ваш ответ действительно ничего не решает. Все, что вы делаете, это вызвать методы по умолчанию вручную. Вам нужно получить доступ к области методов, а не просто называть их. –