2013-11-21 6 views
2

У меня проблемы с пониманием того, что происходит при вызове внешних API-интерфейсов с использованием модели волокон с eventmachine. У меня есть этот код в Синатры:Волокна и несколько HTTP-запросов в 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 

Кроме того, я загрузке сервера Rainbows с помощью разъема :EventMachine с 2-мя соединениями (это означает, что 2 волокна обработки 2 запроса HTTP одновременно).

Теперь, если я сделал 4 одновременных запроса, приложение должно сначала управлять 2, и когда внешние вызовы API выполняются, эти волокна должны иметь возможность управлять 2 новыми HTTP-запросами, ожидая завершения внешнего вызова , правильно?

Этого не происходит. Никакие новые HTTP-запросы не принимаются до тех пор, пока вызов slowapi не вернется и не освободит волокно.

Это правильное поведение? Я что-то упускаю? Спасибо.

+0

Возможно, посмотрите на https://github.com/raggi/async_sinatra –

ответ

1

Собственно, это было правильное поведение.

При настройке Радуги для обработки 2 запросов HTTP, используя 2 волокно, это фактически означает, что количество входящих запросов HTTP в настоящее время ограничивается 2.

Таким образом, ресурсы используются волокнами в то время как медленные API называется свободным (память, файлы, подключения к базе данных и т. Д.), Но сервер не принимает более двух http-соединений, и эти свободные волокна фактически не могут что-либо обработать.

Радуги должны указывать на это более четко в документации. Отправляет им электронное письмо.

Надеюсь, это поможет кому-то.

 Смежные вопросы

  • Нет связанных вопросов^_^