非常にシンプルな安らかなサーバーを作成しようとしています。リクエストを受信したら、現在のスレッドがクライアントにレスポンスを返している間、別のスレッドで処理できる新しいジョブをキューに作成したいと考えています。
私はシナトラを見ましたが、行き過ぎていません。
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
上記の例では、コンシューマー スレッドが (アプリケーションの寿命とは対照的に) 数回しか実行されないことはわかっていますが、これでもうまくいきません。
より良いアプローチはありますか?