2015-02-23 3 views
3

Глядя на Queue API, я не думаю, что он имеет реализацию #each или любой вид итерации. В любом случае мы можем преобразовать потокобезопасную очередь в массив или список, не манипулируя никакими элементами внутри очереди? (Предположим, что эта очередь является неизменной.)Thread-Safe Ruby Queue с .each/iterator

Возможно, я не искал Google, но не смог найти ничего подходящего для этого при потокобезопасной работе.

Любой ответ очень ценится.

+0

Я полагаю, что они не раскрывают такую ​​функциональность, потому что это победит цель очереди. Убедившись, что один и только один потребитель может вытащить данный элемент из очереди, это то, что он делает. Если что-то может получить всю очередь в качестве итеративного объекта, что вещь может нанести хаос, так как мы в принципе никогда не можем предположить, что что-либо в Ruby является неизменным. Может быть, вы можете найти альтернативную реализацию? – Jesper

+0

Вот связанная дискуссия о трудностях итерации над очередью: https://www.ruby-forum.com/topic/1539664 – Jesper

+0

@ Jesper Я не согласен. Существует определенно прецедент для просмотра всех элементов в очереди без 'pop()' каждый элемент FIFO один за другим. Я уверен, что это сложно, поэтому я ищу другую альтернативу. – xbeta

ответ

1

Hamster gem предлагает ряд неизменных структур данных, среди которых форма очереди - Deque.

Deque не реализует each, но его можно преобразовать в список, который является итерируемым.

require 'hamster/deque' 

q = Hamster::Deque[1,2,3] 
q.to_list.each { |n| puts n } 
# => 1 
# => 2 
# => 3 

NB: Deque доступен в кандидатах на выпуск v1.0.1. Эта версия еще не выпущена. Более старые версии Hamster не включают Deque, но имеют какую-то очередность, с которой я не знаком.

+0

Thx! Я это попробую! – xbeta

+0

Я не уверен, кто дает идею Hamster dev, но он возвращает новый deque на каждом нажатии()? что вообще не имеет смысла http://www.rubydoc.info/github/hamstergem/hamster/master/Hamster/Deque '' 'Возвращение нового Deque с добавленным в конце элементом.' '' – xbeta

+0

Я думаю, что это имеет смысл. Deque не будет неизменным, если добавление нового элемента будет мутировать исходный deque. – Jesper