2014-09-14 2 views
2

Каждый раз, когда я запускаю приложение, в первый раз, когда я его называю, он возвращает Dead Actors. После этого он возвращается, как ожидалось.Целлулоид Пул имеет мертвых актеров в первый раз под названием

require 'celluloid' 

class BatchProcess 
    include Celluloid 
    POOL = BatchProcess.pool(size: 6) 

    attr_accessor :base_url, :futures, :objects, :pool, :array 

    def initialize(*args) 
    options = args.extract_options! 
    @base_url = options[:base_url] || "http://some_site.com" 
    @futures = [] 
    @objects = {} 
    end 

    def fetch(array) 
    @pool = POOL 
    @array = array 
    start 
    end 

    def start 
    @grouped_sites = @array.group_by{|i| i[:main_site]} 
    @grouped_sites.each do |main_site, queries| 
     batched_url(main_site, queries) 
    end 
    futures.each {|f| @objects.merge!(f.value) if f.value} 
    end 

    def batched_urls(main_site, queries) 
    queries.each do |query| 
     futures << pool.future(:get_url, main_site, query) 
    end 
    end 

    def get_url(main_site, query) 
    # get http url and parse information process into json data 
    end 
end  

Я затем вызвать его из моего контроллера BatchProcess.new.fetch(array_of_sites_to_parse)

Я попытался поставить @pool = BatchProcess.pool в моем инициализаторе, это не ошибка, но актеры росли в геометрической прогрессии с каждым запросом.

ответ

1

Это потому, что вы создаете пул в качестве константы class до initialize. В точке установлена ​​константа POOL, initialize еще не существует, поэтому ни одна из ваших переменных экземпляра не инициализируется.

После второй попытки будет определен initialize.

Смежные вопросы