我有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不应该是多线程的吗?
更新
新更新:
答案 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
一些有趣的链接: