Необходим пример использования продолжений в игровой среде

Можете ли вы дать мне несколько ссылок с хорошими примерами использования продолжений в игровой среде? (помимо источника игровой среды, их «образцы и тесты» и документация на месте уже были там)

Также приветствуется любая документация и теория в формате "для чайников".


person Mike Stetsyshyn    schedule 01.10.2011    source источник


Ответы (1)


Продолжения работают в основном с использованием метода await(), который доступен через ваш контроллер. Метод await может принимать два разных типа параметров (на самом деле существует 6 перегрузок метода, но это простые вариации двух тем).

Первый вызывает await с тайм-аутом. Это может быть в миллисекундах или может быть указано с помощью строкового литерала, выражающего время, например. 1s на 1 секунду и т. д.

Второй вызов — это вызов await с объектом Future, чаще всего использующий реализацию Java Future в Play под названием Promise (в libs.F). Обещание возвращается, когда обещание выполнено, в том смысле, что событие, которое вызывается как часть обещания, завершено. Однако Promise может быть больше, чем одно событие, это может быть несколько событий. Есть даже варианты сказать waitAny, чтобы он ждал возврата только одного из многих событий.

Таким образом, оба подхода в основном приводят к тому, что событие произойдет в какой-то момент в будущем. Первое предопределено, второе зависит от того, сколько времени потребуется для выполнения Обещания.

Продолжения воспроизведения — это способ упростить кодирование этой структуры событий. Вы можете ввести код, который говорит

// do some logic
await(timeout or promise);
// continue the execution

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

Взяв код с сайта Play для продолжений, там написано

public static void loopWithoutBlocking() {
    for(int i=0; i<=10; i++) { 
         Logger.info(i);
         await("1s");
    }
    renderText("Loop finished");
}

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

person Codemwnci    schedule 01.10.2011
comment
большое спасибо! есть еще один вопрос: не могли бы вы привести пример использования Promise? я попытался создать поток с анонимным внутренним классом и передал ему new Promise<SomeResponceType>. после этого я начал этот поток и вызвал await(Promise<SomeResponceType>), и получил исключение: Caused by: java.lang.IllegalStateException: No continuation is running. я думаю, мне нужно вызвать какой-то метод или инициализировать Promise, прежде чем я смогу выполнить Promise.invoke(SomeResponceType) - person Mike Stetsyshyn; 02.10.2011
comment
Я нашел самый простой способ сделать то, что вы хотите, — расширить Job и использовать new myJob().now(), который возвращает обещание (см. playframework.org/documentation/1.2.3/jobs#tasks). Однако если использование Job для вас не имеет смысла, посмотрите код метода now(), чтобы увидеть, как он создает Promise, в качестве руководства для вас. - person Codemwnci; 03.10.2011
comment
Благодарность! это было то, что я искал! будет копать Job.now() метод. очень жаль, что такая замечательная функция имеет очень размытые примеры в официальном документе, туториале и tests-and-samples! - person Mike Stetsyshyn; 03.10.2011