具有线程安全的Ruby队列,使用.each/迭代器

4
观察队列 API,我认为它没有#each实现或任何迭代运行。有没有办法将线程安全的队列转换为数组或列表,而不操作队列中的任何元素?(假设此队列是不可变的。)也许我在谷歌上搜索得不够好,但找不到与线程安全操作相关的任何内容。非常感谢您的回复。

我认为他们不会公开这种功能,因为这样做会破坏队列的目的。确保只有一个消费者可以从队列中弹出给定元素是它的作用。如果某个东西可以将整个队列作为可迭代对象获取,那么它可能会造成严重后果,因为我们基本上永远不能假设 Ruby 中的任何内容都是不可变的。也许你可以找到一些替代实现? - Jesper
这里有一个关于在队列上进行迭代的困难的相关讨论:https://www.ruby-forum.com/topic/1539664 - Jesper
@ Jesper 我不同意。肯定有一种情况需要查看队列中的所有元素,而不是一个接一个地使用 pop() 弹出每个 FIFO 项。我知道这很困难,所以我正在寻找任何其他替代方案。 - samxiao
我并不是说你没有理由想要做那样的事情,但我会认为仅仅因为有一个使用案例,并不意味着增加该功能是明智的决定。 - Jesper
当然,我在这里寻找其他技巧或类似操作的替代方法,而不是要求Ruby核心团队更改实现。 - samxiao
@Jesper:链接失效了。你还记得当时是怎么找到它的吗? - ribamar
1个回答

1

仓鼠宝石提供了许多不可变数据结构,其中包括一种队列——Deque。

Deque没有实现each,但可以转换为可迭代的List。

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,但具有某种我不熟悉的队列。


谢谢!我会试一下的! - samxiao
我不确定是谁给了仓鼠开发人员这个想法,但每次push()它都返回一个新的deque?这根本毫无意义。http://www.rubydoc.info/github/hamstergem/hamster/master/Hamster/Deque返回一个在末尾添加了项的新Deque。 - samxiao
我认为这是非常合理的。如果添加新元素会改变原始deque,那么deque就不是不可变的了。 - Jesper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接