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

これは、Pool を定義classする前に定数としてインスタンス化しているためです。定数が設定されinitializeた時点ではまだ存在しないため、インスタンス変数は初期化されていません。POOLinitialize

2 回目の試行で、initializeが定義されます。

于 2015-07-12T07:28:24.460 に答える