как реализовать бесконечный цикл в eventmachine

Мне нужен бесконечный цикл поверх eventmachine, который постоянно читает очередь redis. ниже мой код. рекурсия - правильный способ сделать это? Я пробовал loop do цикл, но не смог заставить его работать таким образом.

require 'em-hiredis'

def read
  d = @redis.blpop 'queue', 0
  d.callback do |_, value|
    p value
    read
  end.errback do |e|
    p e
    EM.next_tick { read }
  end
end

EM.run do
  @redis = EM::Hiredis.connect
  read
end

person akonsu    schedule 22.12.2012    source источник
comment
Никогда не работал с EM напрямую, но да, как правило, вы хотите сделать что-то похожее на рекурсию. Вместо повторного вызова функции вы должны инициировать событие, которое обрабатывается самой функцией. Таким образом вы можете предотвратить переполнение стека (AFAIK вы не можете полагаться на оптимизацию хвостовой рекурсии в Ruby). Итак, если EM.next_tick call выполняет то, что я описал, это хороший способ.   -  person skalee    schedule 22.12.2012


Ответы (1)


Лучше подписаться на очередь redis pub / sub. https://gist.github.com/957367 Если вам действительно нужен цикл, тогда EM сам по себе является бесконечным цикл, вам просто нужно снова и снова планировать свою работу с помощью next_tick:

def read
  d = @redis.blpop 'queue', 0
  d.callback do |_, value|
    EM.next_tick { read }
  end.errback do |e|
    EM.next_tick { read }
  end
 end
person Sergii Mostovyi    schedule 23.12.2012