multithreading - 它有 crystal-lang 队列吗?

标签 multithreading queue crystal-lang

如何在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

最佳答案

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

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

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

关于multithreading - 它有 crystal-lang 队列吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48128133/

相关文章:

.net - 使用互锁

multithreading - 广播到多个线程的队列条目

data-structures - 如何在 Neo4J 中处理队列?

javascript - 跨多个元素对 jQuery 事件/操作进行排队

session - 将 Kemal session 与 websocket 结合使用

linux - Linux 上缺少标准库?

multithreading - JavaFx ProgressBar 不更新

c# - System.Threading.ThreadAbortException 错误

java - Executors.newFixedThreadPool 如何停止同步方法上的所有 Activity 线程

linux - 将最大虚拟内存大小增加到 256gb 以上