イベント化されたサブスクリプションを介してキューからメッセージをプルするコンシューマーがあります。これらのメッセージを受け取り、かなり遅い http インターフェイスに接続します。8 つのワーカー プールがあり、それらがすべていっぱいになったら、キューからの要求のプルを停止し、http ジョブで動作しているファイバーを動作させ続ける必要があります。これが私が一緒に投げた例です。
def send_request(callback)
EM.synchrony do
while $available <= 0
sleep 2
puts "sleeping"
end
url = 'http://example.com/api/Restaurant/11111/images/?image%5Bremote_url%5D=https%3A%2F%2Firs2.4sqi.net%2Fimg%2Fgeneral%2Foriginal%2F8NMM4yhwsLfxF-wgW0GA8IJRJO8pY4qbmCXuOPEsUTU.jpg&image%5Bsource_type_enum%5D=3'
result = EM::Synchrony.sync EventMachine::HttpRequest.new(url, :inactivity_timeout => 0).send("apost", :head => {:Accept => 'services.v1'})
callback.call(result.response)
end
end
def display(value)
$available += 1
puts value.inspect
end
$available = 8
EM.run do
EM.add_periodic_timer(0.001) do
$available -= 1
puts "Available: #{$available}"
puts "Tick ..."
puts send_request(method(:display))
end
end
Synchrony ブロックの while ループ内で sleep を呼び出すと、reactor ループが動かなくなることがわかりました。if ステートメント内で sleep を呼び出すと (1 回だけスリープする)、ほとんどの場合、要求が完了するのに十分な時間ですが、せいぜい信頼性が低くなります。EM::Synchrony.sleep を使用すると、メインのリアクター ループが新しい要求を作成し続けます。
メインループを一時停止し、ファイバーの実行を終了させる方法はありますか?