如何在我的场景中从线程获取返回值?

时间:2018-01-20 06:14:29

标签: ruby-on-rails ruby multithreading

所以我想在大约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

但这也不起作用。

1 个答案:

答案 0 :(得分:0)

多线程和Ruby on Rails不能很好地混合。

但是,您应该考虑使用ActiveJob文档(http://guides.rubyonrails.org/active_job_basics.html)。

使用ActiveJob,您可以将作业排队并让它们在后台执行。还定义了钩子方法,以便在作业即将开始,正在运行或已完成时通知您。