【问题标题】:Sidekiq jobs won't run in same time in different queuesSidekiq 作业不会在不同队列中同时运行
【发布时间】:2017-10-19 08:55:01
【问题描述】:

我有 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 页面中,也只有其中一个会真正创建文件并放入内容。Sidekiq 不应该是多线程的吗?

更新:

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

新更新:

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

【问题讨论】:

  • 你的机器和同事的机器有什么区别?操作系统?
  • MacOS 两者。只要我测试多个案例,我就会更新更新列表。
  • 你能测试更新吗?

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


【解决方案1】:

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

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

有趣的是,如果您运行相同的应用程序,但改为启动 10 个 TestWorker(并调整输出以便区分)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

一些有趣的链接:

【讨论】:

猜你喜欢
  • 2012-10-29
  • 2018-06-29
  • 1970-01-01
  • 2013-06-16
  • 2019-07-09
  • 1970-01-01
  • 1970-01-01
  • 2022-08-15
  • 1970-01-01
相关资源
最近更新 更多