所以我想在大约10个网站上解析表格,所以我想为每个网站创建一个新的主题。但是,我不确定如何从这种类型的请求中返回数据。
这是一节课:
class TestRequest
def initialize
end
def start
urls = ['site1','site2','site3']
existing_data = Data.pluck(:symbol, :page)
data = GetData.pool(size: 10)
urls.each do |url|
data.async.perform_requests(url, existing_data)
end
end
end
然后GetData类看起来像这样:
require 'celluloid/current'
class GetData
include Celluloid
def perform_requests(url, existing_data)
# perform HTTP request
# parse HTTP response
# return returned data ???
end
end
我最终想做的是在TestRequest类中有一个实例变量,只需将GetData返回的值添加到TestRequest类的实例变量中。线程完成后,我想使用实例变量中的数据执行另一个操作。
我尝试使用attr_reader
,但似乎并没有对我有利。
我试过了:
class TestRequest
def initialize
end
def start
@returned_data = []
urls = ['site1','site2','site3']
existing_data = Data.pluck(:symbol, :page)
data = GetData.pool(size: 10)
urls.each do |url|
data.async.perform_requests(url, existing_data)
end
end
attr_reader :returned_data
end
然后
require 'celluloid/current'
class GetData
include Celluloid
def perform_requests(tr, existing_data)
# perform HTTP request
# parse HTTP response
t = TestData.new
t.returned_data << "value"
end
end
但这也不起作用。
答案 0 :(得分:0)
多线程和Ruby on Rails不能很好地混合。
但是,您应该考虑使用ActiveJob文档(http://guides.rubyonrails.org/active_job_basics.html)。
使用ActiveJob,您可以将作业排队并让它们在后台执行。还定义了钩子方法,以便在作业即将开始,正在运行或已完成时通知您。