具有消费者线程和作业队列的Ruby Sinatra

我正在尝试创建一个非常简单的restful服务器。 当它收到请求时,我想在队列上创建一个新作业,当前线程向客户端返回响应时,该作业可由另一个线程处理。

我看着西纳特拉,但还没走得太远。

require 'sinatra' require 'thread' queue = Queue.new set :port, 9090 get '/' do queue << 'item' length = queue.size puts 'QUEUE LENGTH %d', length 'Message Received' end consumer = Thread.new do 5.times do |i| value = queue.pop(true) rescue nil puts "consumed #{value}" end end consumer.join 

在上面的例子中,我知道消费者线程只会运行几次(而不是应用程序的生命周期),但即使这样也不适用于我。

有更好的方法吗?

你的主要问题是你对Queue#pop调用。 你传递的是true ,这导致它不会暂停线程并引发exception,而是用nil救援。 因此,您的消费者线程会在其他任何事情发生之前循环五次。

您需要将该行更改为

 value = queue.pop 

这样线程就会等待新数据被推送到队列中。

您还需要从最后删除consumer.join行,因为一旦您将调用更改为pop ,这将导致死锁。

(此外,它不是您主要问题的一部分,但看起来您需要printf而不是在打印队列长度时puts )。