赛璐珞池首次召唤死亡演员

时间:2014-09-14 14:10:42

标签: ruby celluloid

每当我启动应用程序时,第一次调用它时,它会返回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 个答案:

答案 0 :(得分:1)

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

第二次尝试时,将定义initialize