Мне нужно обрабатывать задания из очереди в процессе, при этом IO выполняется асинхронно. Это довольно просто. Получено, что эти задания могут добавлять дополнительные предметы в очередь.Создание асинхронной очереди в Ruby
Я думаю, что я слишком долго ловил эту проблему, поэтому мой мозг облачно - это не должно быть слишком сложно. Я продолжаю придумывать либо-либо сценарий:
- Очередь может выполняться асинхронно, и результаты могут быть объединены впоследствии.
- Очередь может выполнять синхронно выполнение заданий до тех пор, пока последняя не завершится, а очередь пуста.
Я возился со всем от EventMachine и Голиафа (оба из которых может использовать EM::HttpRequest
) целлулоид (никогда не удосужился построить что-то с ним, хотя), и писать счетчики с использованием волокон. Мой мозг жарится.
То, что я хотел бы, просто, чтобы быть в состоянии сделать это:
items = [1,2,3]
items.each do |item|
if item.has_particular_condition?
items << item.process_one_way
elsif item.other_condition?
items << item.process_another_way
# ...
end
end
#=> [1,2,3,4,5,6]
... где 4, 5 и 6 были все результаты обработки исходных элементов в наборе, и 7, 8 и 9 являются результатом обработки 4, 5 и 6. Мне не нужно беспокоиться о бесконечной обработке очереди, потому что обработанные мной данные заканчиваются после нескольких итераций.
Руководства, комментарии, ссылки на другие библиотеки и т. Д. Приветствуются, а также примеры кода реализации более низкого уровня.
Да, асинхронные системы могут быть сложными. У вас есть моральная поддержка :) –
Мое первое предложение: спать на нем. Когда вы начинаете ударять головой о стену, и все начинает казаться невероятно сложным. Из опыта я знаю, что пришло время назвать это днем. На следующий день проблема обычно решается сама по себе удивительно легко.Я люблю решать проблемы во сне - это не требует «усилий», и на следующий день вы обычно чувствуете себя гением. – Casper
@ Каспер Я думаю, я не указал, что «слишком долго» влечет за собой работу над этим несколько недель, кое-где. :/ – coreyward