質問: Sinatraを使用してWebプロキシを構築すると、I/Oブロッキングを処理できますか? (+奇妙なHeroku要求の並行性の問題) 私はHTTPのWebプロキシに似た何かを書こうと思っています。私は現在、SinatraでRubyを使ってこれを調べています。 私の主な心配の1つは、私が別のサーバに行うHTTP要求が戻ってくるまでに時間がかかることです。その間に他のリクエストを引き続き提供できるようにするにはどうすればよいですか? このようなブロックをシミュレートする、非常に工夫した例を作成しました。 hello.rb: ``` require 'rubygems' require 'sinatra' set :server, 'thin' get '/fast' do 'Fast Hello World!' end get '/slow' do sleep 10 'Slow Hello World!' end ``` config.ru: ``` require './hello' run Sinatra::Application ``` 私が絶対に困惑しているのはこれです。これをローカルで "ruby hello.rb"を使って実行すると、access/slowはアクセス/高速化を妨げません。しかし、私がHerokuにデプロイすると、突然、/ fastへのリクエストは、リクエストが完了するまで/遅くなるのを待ちます。私はローカルでもHerokuでも、このアプリはシングルスレッドのThinで動作していると思っていました。私はなぜ違う行動を取るのか理解できません。 私はこのすべてにかなり新しいです。なぜ私はこの矛盾した行動を経験していますか?私がしようとしていることを達成するための良い方法は何でしょうか? ありがとう!
回答: コマンド "ruby hello.rb"は要求を実行した後にthinのWebサーバーをシャットダウンするので、herokuはWebサーバー上であなたのルビースレッドを有効に保つので、HTTPリクエストでもっと時間を取ることができます。 あなたは、この `thin start` (あなたの現在のディレクトリにconfig.ruがあることを確認してください)のようにサーバをインストールした場合、herokuとして結果が表示されます。