Skip to content

Instantly share code, notes, and snippets.

@jimsynz
Created August 24, 2012 07:15
Show Gist options
  • Save jimsynz/3447035 to your computer and use it in GitHub Desktop.
Save jimsynz/3447035 to your computer and use it in GitHub Desktop.
Qu worker that uses EventMachine.
class QuEmWorker < Qu::Worker
def start
EM.next_tick do
Thread.new do
logger.warn "Worker #{id} starting"
Qu.backend.register_worker(self)
EM.add_shutdown_hook do
Qu.backend.unregister_worker(self)
logger.debug "Worker #{id} done"
end
EM.add_periodic_timer 1 do
do_work Qu.reserve(self, block: false)
end
end
end
end
def work_off
logger.debug "Worker #{id} working of all jobs"
while job = Qu.reserve(self, block: false)
do_work job
end
end
def work
logger.debug "Worker #{id} waiting for next job"
do_work Qu.reserve(self)
end
def id
@id ||= "#{hostname}:#{pid}:#{thread_id}:#{queues.join(',')}"
end
private
def do_work(job)
if job
logger.debug "Worker #{id} reserved job #{job}"
EM.defer -> { job.perform }, ->(_) {logger.debug "Worker #{id} completed job #{job}"}
end
end
def keep_going?
!!@keep_going
end
def thread_id
Thread.current.object_id.to_s(16)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment