如何在我的方案中从线程获取返回值



所以我想在大约 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,您可以将作业排队并在后台执行。还定义了钩子方法,用于在作业即将启动、正在运行或完成时通知您。

最新更新