Sidekiq作业不会在不同的队列中同时运行

时间:2017-10-19 08:55:01

标签: ruby-on-rails ruby concurrency parallel-processing sidekiq

我有2名Sidekiq工人:

富:

​# frozen_string_literal: true
  class FooWorker
    include Sidekiq::Worker
    sidekiq_options queue: :foo
    def perform
      loop do
        File.open(File.join(Rails.root, 'foo.txt'), 'w') { |file| file.write('FOO') }
      end
    end
  end

栏:

# frozen_string_literal: true
  class BarWorker
    include Sidekiq::Worker
    sidekiq_options queue: :bar
    def perform
      loop do
        File.open(File.join(Rails.root, 'bar.txt'), 'w') { |file| file.write('BAR') }
      end
    end
  end

它具有完全相同的功能,两者都在不同的队列上运行,yaml文件如下所示:

---
:queues:
  - foo
  - bar

development:
  :concurrency: 5

问题是,即使两者都在Sidekiq UI的Busy页面中运行和显示,其中只有一个实际上会创建一个文件并放入内容.Sodkiq不应该是多线程的吗?

更新

  • 这只发生在我的机器上
  • 我使用rails new和相同的
  • 创建了一个新项目
  • 我克隆了一个同事项目并运行了他的sidekiq并且正在工作!!!
  • 我使用他的sidekiq版本,不工作!

新更新:

  • 如果他克隆我的项目,也会在我的同事机器上发生这种情况
  • 如果我使用有限循环运行2个作业(比如10次执行睡眠),第一个作业将被执行然后第二个作业,但是在第二个作业完成并再次开始之后,它们将按预期同时运行 - - 从github.com/ArayB/sidekiq-test克隆项目的每个人都遇到了问题。

1 个答案:

答案 0 :(得分:0)

Sidekiq不是问题。这是Ruby / MRI / Thread / GIL中的某个问题。谷歌获取更多信息,但我的理解是,有时线程不是真正的线程(参见"绿色线程")所以真的只是模拟线程。重要的是一次只能执行一个线程。

有趣的是,只有两个线程,系统没有给第二个线程留出时间。不知道为什么,但是当你再次运行它时必须意识到它的错误。

有趣的是,如果您运行相同的应用程序,而是启动10个TestWorkers(并调整输出,以便您可以区分)sidekiq将立即运行所有10""。

10.times {|i| TestWorker.perform_async(i) }

这是经过调整的工人。请务必清除输出原因,这也可能导致线程和TTY缓冲问题不能反映现实。

class TestWorker
  include Sidekiq::Worker

      def perform(n)
        10.times do |i|
          puts "#{n} - #{i} - #{Time.current}"
          $stdout.flush
          sleep 1
        end
      end
    end

一些有趣的链接: