簡體   English   中英

Sidekiq作業不會在不同的隊列中同時運行

[英]Sidekiq jobs won't run in same time in different queues

我有2個Sidekiq工人:

Foo:

​# 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遇到問題。

Sidekiq沒問題。 這是Ruby / MRI / Thread / GIL中的一個問題。 Google提供更多信息,但我的理解是,有時線程不是真正的線程(請參閱“綠色線程”),因此實際上只是模擬線程。 重要的是一次只能執行一個線程。

有趣的是,只有兩個線程,系統沒有給第二個線程分配時間。 不知道為什么,但是當您再次運行它時必須意識到這是錯誤的。

有趣的是,如果您運行相同的應用程序,而是解雇了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

一些有趣的鏈接:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM