2013-11-21 19 views
2

我有问题了解使用带有eventmachine的光纤模型调用外部API时发生了什么。我有这样的代码在西纳特拉:Sinatra中的光纤和多个http请求

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与2个连接(这意味着2种纤维处理在时刻2个的http请求)引导彩虹服务器。

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

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

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

+0

也许看看https://github.com/raggi/async_sinatra –

回答

1

其实,这是正确的行为。

当配置彩虹来处理使用2个纤维2 http请求,它实际上意味着在传入的HTTP请求的数目被限制为2。

所以,正在使用的同时缓慢纤维上的资源API被称为是免费的(内存,文件,数据库连接等),但服务器不接受超过2个http连接,并且这些空闲光纤实际上不能处理任何东西。

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

希望这有助于某人。