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我的初始化程序中,它没有出错,但是每个请求都会成倍增长。

4

1 回答 1

1

这是因为您在定义class之前将 Pool 实例化为常量。initialize在您POOL设置常量时,initialize尚不存在,因此您的实例变量都未初始化。

在第二次尝试时,initialize将被定义。

于 2015-07-12T07:28:24.460 回答