每当我启动应用程序时,第一次调用它时,它会返回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
放入我的初始化程序中,它没有错误,但是演员随着每个请求呈指数级增长。
答案 0 :(得分:1)
这是因为您在定义class
之前将池实例化为initialize
常量。在设置POOL
常量时,initialize
尚不存在,因此没有初始化实例变量。
第二次尝试时,将定义initialize
。