2016-01-17 2 views
0

Я использую EventMachine.defer для обработки некоторых длительных процессов (неопределенное ожидание ответа от внешнего приложения). Я хочу сделать это в цикле: каждый раз, когда приложение отвечает, я обрабатываю ответ и сразу же хочу начать ждать следующего ответа.Вызов EventMachine отложить в обратном вызове?

Мой код в настоящее время выглядит следующим образом:

def watch_for_songs_change 
    EM.defer(
    ->(){ `mpc idle playlist` }, # wait for the song list to change 
    ->(_){ update_songs; watch_for_songs_change } 
) 
end 

я понял, что это звонит defer изнутри обратного вызова из defer. Действительно ли это? Я порождаю один поток изнутри другого и в конечном итоге закончим потоки? Или EventMachine вызывает обратный вызов после того, как он вернул поток в пул?

+0

Выполняется ли плейлист 'mpc idle playlist' до тех пор, пока плейлист не будет изменен? если нет, то использование 'EM.defer' на самом деле не дает вам многого. – maniacalrobot

ответ

0

Я пытался связать вызовы, подобные этому ранее, в EM, и обнаружил, что использование периодических таймеров - это, как правило, лучший дизайн.

@timer = EventMachine.add_periodic_timer(1) { `mpc idle playlist` and update_songs } 
Смежные вопросы