Sidekiq作业将不会在同一时间运行在不同的队列
问题描述:
我有2名Sidekiq工人: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都遇到了问题。
答
这不是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
一些相关链接:
+0
关于GIL和线程的好文章:https://medium.com/@zanker/ruby-vm-and-how-apps-break-部分1-81a309384f39 –
什么是你和同事的机器之间的区别?操作系统? – mudasobwa
MacOS两者。只要我测试多个案例,我会更新更新列表。 –
您可以测试更新吗? –