簡體   English   中英

與em同步的EventMachine我需要正確限制我的http請求

[英]EventMachine with em-synchrony I need to correctly throttle my http requests

我有一個使用者,它通過事件訂閱將消息從隊列中拉出。 它接收這些消息,然后通過一個相當慢的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

我發現,如果我在同步塊的while循環內調用sleep,反應堆循環就會卡住。 如果我在if語句中調用sleep(僅睡一次),那么大多數情況下它足以完成請求,但充其量是不可靠的。 如果我使用EM :: Synchrony.sleep,那么主反應堆循環將繼續創建新請求。

有沒有辦法暫停主循環,但讓光纖完成執行?

sleep 2

...

add_periodic_timer(0.001)

你是認真的嗎?

您是否曾經在循環中休眠過多少send_request 而且每秒增加1000。

那這個呢:

require 'eventmachine'
require 'em-http'
require 'fiber'

class Worker
  URL = 'http://example.com/api/whatever'

  def initialize callback
    @callback = callback
  end

  def work
    f = Fiber.current
    loop do
      http = EventMachine::HttpRequest.new(URL).get :timeout => 20

      http.callback do
        @callback.call http.response
        f.resume
      end
      http.errback do
        f.resume
      end

      Fiber.yield
    end
  end
end

def display(value)
  puts "Done: #{value.size}"
end

EventMachine.run do
  8.times do
    Fiber.new do
      Worker.new(method(:display)).work
    end.resume
  end
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM