[英]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沒問題。 這是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.