class Sidekiq::Workers

A worker is a thread that is currently processing a job. Programmatic access to the current active worker set.

WARNING WARNING WARNING

This is live data that can change every millisecond. If you call size => 5 and then expect each to be called 5 times, you're going to have a bad time.

workers = Sidekiq::Workers.new
workers.size => 2
workers.each do |process_id, thread_id, work|
  # process_id is a unique identifier per Sidekiq process
  # thread_id is a unique identifier per thread
  # work is a Hash which looks like:
  # { 'queue' => name, 'run_at' => timestamp, 'payload' => msg }
  # run_at is an epoch Integer.
end

Public Instance Methods

each() { |key, tid, load_json| ... } click to toggle source
# File lib/sidekiq/api.rb, line 902
def each
  Sidekiq.redis do |conn|
    procs = sscan(conn, 'processes')
    procs.sort.each do |key|
      valid, workers = conn.pipelined do
        conn.exists(key)
        conn.hgetall("#{key}:workers")
      end
      next unless valid
      workers.each_pair do |tid, json|
        yield key, tid, Sidekiq.load_json(json)
      end
    end
  end
end
size() click to toggle source

Note that size is only as accurate as Sidekiq's heartbeat, which happens every 5 seconds. It is NOT real-time.

Not very efficient if you have lots of Sidekiq processes but the alternative is a global counter which can easily get out of sync with crashy processes.

# File lib/sidekiq/api.rb, line 924
def size
  Sidekiq.redis do |conn|
    procs = sscan(conn, 'processes')
    if procs.empty?
      0
    else
      conn.pipelined do
        procs.each do |key|
          conn.hget(key, 'busy')
        end
      end.map(&:to_i).inject(:+)
    end
  end
end