2017-10-19 62 views
0

我有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都遇到了问题。
+0

什么是你和同事的机器之间的区别?操作系统? – mudasobwa

+0

MacOS两者。只要我测试多个案例,我会更新更新列表。 –

+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 

一些相关链接:

+0

关于GIL和线程的好文章:https://medium.com/@zanker/ruby-vm-and-how-apps-break-部分1-81a309384f39 –

相关问题