2015-02-23 38 views
3

看看Queue API,我不認爲它有#each實現或任何類型的迭代運行。無論如何,我們可以將線程安全隊列轉換爲數組或列表,而無需操縱隊列中的任何元素? (讓我們假設這個隊列是不可改變的)。使用.each/iterator的線程安全Ruby隊列

也許我沒有很好地搜索Google,但是找不到與線程安全操作相關的任何內容。

任何答覆,非常感謝。

+0

我認爲他們沒有公開這種功能,因爲它會打敗隊列的目的。確保只有一個消費者可以從隊列中彈出給定的元素是它的功能。如果某件事情能夠將整個隊列作爲一件可以產生havok的可迭代對象,那麼我們基本上可以永遠不會假設Ruby中的任何東西都是不可變的。也許你可以找到一些替代實現? – Jesper 2015-02-23 08:28:06

+0

下面是關於隊列迭代的困難的相關討論:https://www.ruby-forum.com/topic/1539664 – Jesper 2015-02-23 08:29:57

+0

@Jesper我不同意。沒有'pop()'每個FIFO項目一個接一個地查看隊列中的所有元素肯定有用例。我確定這很困難,所以我正在尋找其他的選擇。 – xbeta 2015-02-23 08:37:18

回答

1

Hamster gem提供了許多不可變的數據結構,其中包括隊列形式 - Deque。

Deque不實現each,但它可以轉換爲可迭代的List。

require 'hamster/deque' 

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

注意:Deque在v1.0.1候選版本中可用。該版本尚未發佈。較早版本的倉鼠不包括Deque,但有某種我不熟悉的隊列。

+0

Thx!我會試試看! – xbeta 2015-02-25 01:34:30

+0

我不確定是誰向Hamster dev提供了這個想法,但是它會在每次push()時返回一個新的雙端隊列?根本沒有意義 http://www.rubydoc.info/github/hamstergem/hamster/master/Hamster/Deque '''返回一個新的Deque,並在最後添加item。''' – xbeta 2015-02-26 00:57:15

+0

我認爲這很有道理。如果添加一個新元素會改變原始的雙端隊列,那麼雙端隊列不會是不可變的。 – Jesper 2015-02-26 07:29:31