所以我想在大约 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
但这也行不通。
多线程和 Ruby on Rails 不能很好地混合。
但是,您应该考虑使用活动作业文档 (http://guides.rubyonrails.org/active_job_basics.html(。
使用 ActiveJob,您可以将作业排队并在后台执行。还定义了钩子方法,用于在作业即将启动、正在运行或完成时通知您。