【问题标题】:Simple, efficient FIFO queue with Elixir使用 Elixir 的简单、高效的 FIFO 队列
【发布时间】:2021-10-13 21:21:43
【问题描述】:

是否有内置数据类型可用于 Elixir 中的 FIFO 队列?

我查看了列表,但似乎获取列表尾部效率不高?也许我错了?

我的队列需要容纳 100,000 个或更多元素。 我的需要是每秒生成 44100 个元组,格式为 {t, y} 用于音频。我正在尝试实现延迟,因此在将音频发送到处理管道之前,我需要排队几秒钟(可能最多 10 秒?)。

【问题讨论】:

  • 你检查过 Erlang 队列 - erlang.org/doc/man/queue.html 吗?
  • 我刚刚发现了这个,看起来正是我需要的,谢谢!
  • arathunku,erlang 队列运行良好,如果您将此作为答案,我会接受
  • 乔希,太好了,它解决了问题!我已经添加了答案。

标签: elixir


【解决方案1】:

我不确定 100,000 个或更多元素的性能,但看起来您正在寻找 Queue。这是一个由 Erlang/OTP 提供的 FIFO 队列。

例子:

iex(39)> queue = :queue.new                            
{[], []}
iex(40)> queue = :queue.in(1, queue)                   
{[1], []}
iex(41)> queue = :queue.in(2, queue)                   
{[2], [1]}
iex(42)> queue = :queue.in(3, queue)
{[3, 2], [1]}
iex(43)> :queue.out(queue)                             
{{:value, 1}, {[3], [2]}}
iex(44)> {{:value, head}, queue} = :queue.out(queue)
{{:value, 1}, {[3], [2]}}
iex(45)> head
1
iex(46)> {{:value, head}, queue} = :queue.out(queue)
{{:value, 2}, {[], [3]}}
iex(47)> head
2
iex(48)> {{:value, head}, queue} = :queue.out(queue)
{{:value, 3}, {[], []}}
iex(49)> head
3
iex(51)> :queue.out(queue)        
{:empty, {[], []}}

【讨论】:

  • 跨节点复制的东西怎么样?
  • 由于 Erlang 代码经常用于软实时应用程序,因此请注意标准 queueamortized 性能特征。例如,在 100,000 次 in 调用之后,第一个 out 调用将是 O(N) 操作。但是剩下的 99,999 个out 调用将是 O(1)。
  • 你有一个简单的例子可以添加到答案中吗?
  • @arcseldon 添加了
  • Erlang 的 queue 周围还有许多 Elixir 包装器。我喜欢Qex,因为它为Enumerable 等添加了协议实现。
【解决方案2】:

如果您正在寻找比 erlang 的 :queue 更多功能的东西,我不久前构建了这个 Elixir 队列库:https://github.com/fredwu/opq

它提供了诸如工作池和速率限制等功能。它建立在:queue 之上。 :)

一个简单的例子:

{:ok, opq} = OPQ.init()

OPQ.enqueue(opq, fn -> IO.inspect("hello") end)
OPQ.enqueue(opq, fn -> IO.inspect("world") end)

【讨论】:

    猜你喜欢
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 2023-04-03
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多