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

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

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

4
localhost 11 Апр 2014 в 19:44

2 ответа

Лучший ответ

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

5
drexin 11 Апр 2014 в 16:14