并行宝石Ruby中的线程

时间:2018-07-24 15:24:11

标签: ruby redis ruby-on-rails-5 sidekiq

我正在使用sidekiq gem作为队列。而且我想在队列中处理执行并行操作。

这是我的队列代码

      def perform(disbursement_id)
         some logic...
          Parallel.each(disbursement.employee_disbursements, in_threads: 2) do |employee|
            amount = amount_format(employee.amount)
            res = unload_company_account(cmp_acc_id, amount.to_s)
            load_employee_account(employee) unless res.empty?
          end
      end

现在,当我在不使用线程的情况下使用Parallel.each()时,效果很好,但是当我使用Parallel.each(..,in_threads:3)时,它将进入队列的繁忙状态。

不确定为什么in_threads使我的队列进入繁忙状态。我无法解决。

1 个答案:

答案 0 :(得分:0)

尝试下使其正常工作

Parallel.each(disbursement.employee_disbursements, in_threads: 2) do |employee|
  ActiveRecord::Base.connection_pool.with_connection do
    amount = amount_format(employee.amount)
    res = unload_company_account(cmp_acc_id, amount.to_s)
    load_employee_account(employee) unless res.empty?
  end
end

此外,当使用地图而不是每个地图或将属性preserve_results用作truefalse时,该问题就消失了。这有点神秘,因为:

def each(array, options={}, &block)
  map(array, options.merge(:preserve_results => false), &block)
end