它有一个水晶队列吗?

时间:2018-01-06 14:05:08

标签: multithreading queue crystal-lang

如何实现模式生产者 - 晶莹消费者?我正在寻找类似的东西 - http://ruby-doc.org/core-2.2.0/Queue.html 可能我需要使用Channel,但我不明白如何...因为它等待"消费者"将收到。

我的意思是:

channel = Channel(Int32).new

spawn do
  15.times do |i|
    # ... do something that take a time
    puts "send #{i}"
    channel.send i # paused while someone receive, but i want to continue do the job that takes a time..
  end
end

spawn do
  loop do
    i = channel.receive
    puts "receive #{i}"
    sleep 0.5
  end
end

sleep 7.5

1 个答案:

答案 0 :(得分:3)

你是对的,使用Channel是解决Crystal中连接通信的好方法。 请注意,默认情况下,Channel只能存储一个值,直到收到它为止。

但是您可以使用缓冲通道将多个值发送到通道,并且不需要立即接收它们。这实际上是一个FIFO队列,其中新项目在一端添加并从另一端删除。

# Create a channel with a buffer for 32 values
channel = Channel(Int32).new(32)