Как приостановить и возобновить работу потребителя в кролике

Есть ли способ временно приостановить работу потребителя и возобновить его позже?

Вот пример того, что я хочу сделать:

require "bunny"
conn = Bunny.new
conn.start

ch1 = conn.create_channel
publisher = ch.direct('test', :auto_delete => false)

consumer1 = nil
Thread.new do
    ch2 = conn.create_channel(nil, 8) #Using eight worker
    queue1 = ch2.queue('', :exclusive => true)
    queue1.bind(publisher, :routing_key => 'low_priority')
    consumer1 = queue1.subscribe(:block => true) do |delivery_info, properties, payload|
       #do some work
    end
end

Thread.new do
    ch3 = conn.create_channel
    queue2 = ch3.queue('', :exclusive => true)
    queue2.bind(publisher, :routing_key => 'high_priority')
    consumer2 = queue2.subscribe(:block => true) do |delivery_info, properties, payload|
        consumer1.pause   #pause the other consumer
        #do other things
        consumer1.resume  #resume the consumer
    end
end
#rest of the code

Я хочу приостановить работу потребителя 1, когда я работаю над потребителем 2. Есть ли какой-нибудь действенный способ сделать это?


person Putu Pradnyana    schedule 04.03.2016    source источник


Ответы (1)


Если вы хотите создать политики приоритета, bunny реализовал это:

http://rubybunny.info/articles/queues.html#consumer_priorities

q = ch.queue("a.queue")
q.subscribe(:manual_ack => true, :arguments => {"x-priority" => 5}) do |delivery_info, properties, payload|
  # ...
end
q.subscribe(:manual_ack => true, :arguments => {"x-priority" => 2}) do |delivery_info, properties, payload|
  # ...
end

И если вы хотите обрабатывать его параллельно, я предлагаю этот камень:

https://github.com/grosser/parallel

Пример:

results = Parallel.map(['a','b','c'], in_processes: 3) { |one_letter| ... }

Надеюсь, поможет.

person Alvaro Cantador    schedule 24.04.2016
comment
Можете ли вы предоставить краткий обзор двух ссылок, которые вы предоставили? Таким образом, ответ здесь, если ссылки сломаются в будущем. Вы можете отредактировать свой ответ, чтобы включить эту информацию. - person Theresa; 25.04.2016