1

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

我看着 Sinatra,但还没有走得太远。

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

在上面的示例中,我知道消费者线程只会运行几次(与应用程序的生命周期相反),但即使这对我也不起作用。

有更好的方法吗?

4

1 回答 1

4

您的主要问题是您对Queue#pop. 您正在传递true,这导致它不会暂停线程并引发异常,您可以使用nil. 因此,您的消费者线程会循环五次,然后才能发生任何其他事情。

您需要将该行更改为

value = queue.pop

以便线程等待新数据被推送到队列中。

您还需要consumer.join从末尾删除该行,因为一旦您将调用更改为pop.

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

于 2013-04-15T20:46:39.170 回答