2014-04-11 4 views
2

Я только начал изучать структуру Play в последнее время и действительно нравится это до сих пор. Есть только одна вещь, которая не ясна для меня. Я разработчик Java с блокировкой и многопоточным способом мышления, поэтому асинхронное программирование для меня немного новое.Как проиллюстрировать API асинхронного WS

Таким образом, структура Play использует асинхронный WS API, который не блокирует поток, который вызывает его, ни это блоки или нерестится любую другую нить. При выполнении какого-либо асинхронного программирования обычно у вас есть , чтобы создать новый поток, а затем сделать WS-вызов, чтобы вы не блокировали основной поток. Итак, мой вопрос здесь в том, как API WS для воспроизведения удается выполнить асинхронный вызов веб-службы, не блокируя текущий поток и не создавая новый? Проводит ли он запрос, а затем основной поток каждый раз, в небольших проверках, есть ли ответ в объекте Future? Я знаю, как его использовать, но я хочу знать, что такое сделка под капотом. Как это будет реализовано в Scala? Простым примером, если это было возможно, была бы хорошая помощь.

Спасибо заранее и с наилучшими пожеланиями!

ответ

4

Под капотом в игре используется async-http-client, основанный на NIO. Запрос будет отправлен, и когда сервер ответит, обратный вызов (в этом случае завершение будущего) будет выполнен по потоку из потока. Таким образом, нить не должна блокироваться.

+0

Ну, теперь мне кажется немного более понятным. Просто я не совсем понимаю, как поток, который вызывает обратный вызов, знает, что ответ доступен, если он не заблокирован и не ждет ответа? Проверяет ли он время от времени, если ответ пришел? – localhost

+2

Это немного сложнее, чем это. NIO предоставляет селектора, которые контролируют каналы для событий. Один поток может отслеживать несколько каналов таким образом и отправлять обратные вызовы в threadpool, когда есть данные для обработки. – drexin

+0

@drexin Этот комментарий должен быть частью ответа. – nir

1

Play использует «контекст выполнения», который обычно представляет собой пул потоков, как описано в documentation:

Это важно понять, какой поток кода работает на фьючерсных контрактов. В двух кодовых блоках, приведенных выше, есть импорт в контексте исполнения по умолчанию . Это неявный параметр, который передается всем методам будущего API, которые принимают обратные вызовы. Контекст часто будет эквивалентен пулу потоков, но не обязательно .

Таким образом, новые нити не создаются, но только потому, что для такой работы уже имеется пул потоков.

+0

Итак, в основном это означает, что основной поток использует поток из пула потоков для запроса веб-службы? Этот поток из пула блокирует и ждет ответа от веб-службы? Какой смысл асинхронного WS-клиента, если вам нужно занять новый поток, ожидающий ответа? – localhost

+0

Я думаю, что drexin рассмотрел это: обратный вызов запускается системными вызовами системного асинхронного ввода нижнего уровня (например, Linux 'select' /' poll'/'epoll'), которые абстрагируются библиотеками Java NIO, поэтому это не связать много потоков. – DNA

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