Sinatra中的纤维和多个http请求

时间:2013-11-21 11:06:07

标签: asynchronous sinatra eventmachine fibers rainbows

使用带有eventmachine的光纤模型调用外部API时,我无法理解发生了什么。我在Sinatra有这个代码:

get '/' do
  conn = Faraday.new 'http://slow-api-call' do |con|
    con.adapter :em_http
  end
  resp = conn.get
  resp.on_complete {
    request.env['async.callback'].call(resp)
  }
  throw :async
end

此外,我正在使用:EventMachine连接器启动Rainbows服务器,连接器有2个连接(这意味着2个光纤一次处理2个http请求)。

现在,如果我发出4个并发请求,应用程序应首先管理2个,并且在进行外部API调用时,这些光纤应该能够在等待外部调用完成时管理2个新的http请求,对?

这没有发生。在slowapi调用返回并释放光纤之前,没有新的http请求被接受。

这是正确的行为吗?我错过了什么吗? 感谢。

1 个答案:

答案 0 :(得分:1)

实际上,这是正确的行为。

配置彩虹以使用2根光纤处理 2个http请求时,实际上意味着传入的http请求数量限制为2个。

因此,调用慢速API时光纤使用的资源是免费的(内存,文件,数据库连接等),但是服务器不接受超过2个http连接,并且这些免费光纤实际上无法处理任何内容

彩虹应该在文档中更清楚地指出这一点。会给他们发一封电子邮件。

希望这有助于某人。