Разница между будущим и моно

Вопрос задан: 10 месяцев назад Последняя активность: 5 месяцев назад
up 3 down

В (Java) реактивном программировании, какая разница между Future<T> и (Реактор проекта) Mono<T>? Похоже, что оба являются средством доступа к результату асинхронных вычислений в будущем, когда вычисление будет завершено. Зачем вводить Mono интерфейс, если Future уже делает работу?

2 ответа

Возможно, для Вашего проекта будут необходимы бесплатные векторные карты. На нашем сайте представлены карты для всех стран.

Реклама

up 3 down accepted

Самая большая разница в том, что Mono<T> может быть полностью ленивым, тогда как, когда вы получаете Future<T>, базовая обработка уже началась.

С типичной простудой Mono, ничего не произойдет, пока ты subscribe() к нему, что позволяет передать Mono вокруг в приложении и попутно дополняйте его операторами, прежде чем даже начинать обработку.

Также гораздо проще поддерживать асинхронность Mono по сравнению с Future (где API имеет тенденцию заставлять вас вызывать блокировку get()).

Наконец, по сравнению с обоими Future а также CompletableFuture, аспект композиции улучшен в Mono с обширным словарем операторов, которые он предлагает.

up 0 down

Производитель и потребитель могут общаться двумя способами: синхронно и асинхронно.

В синхронном (на основе тяг) способе, потребитель является потоком, и используется некоторый промежуточный объект коммуникатора. Обычно это очередь блокировки. В особом случае, когда в течение всего сеанса связи между производителем и потребителем передается только одно значение, коммуникатор, реализующий интерфейс Future может быть использован. Этот способ называется синхронным, потому что потребитель вызывает такой метод связи, как Future.get() и что методы ждут, пока значение не станет доступным, а затем возвращают это значение в результате. То есть, запрос значения и его получение программируются в одном и том же операторе, хотя эти действия могут быть разделены во времени.

Недостаток синхронного обмена данными заключается в том, что когда потребитель ожидает запрошенного значения, он тратит значительный объем памяти для своего стека потоков. В результате мы можем иметь только ограниченное количество действий, которые ждут данных. Например, это могут быть интернет-соединения, обслуживающие нескольких клиентов. Чтобы увеличить это число, мы можем представить потребителя не как поток, а как некоторый относительно небольшой объект с методами, вызываемыми производителем или коммуникатором, когда данные для потребителя доступны. Этот способ называется асинхронным. Он разделен на 2 действия: запрос производителя на передачу данных и передачу этих данных потребителю. Это асинхронный (push-based) метод.

Теперь ответ на вопрос: Future может выступать только в качестве синхронного коммуникатора (с get методы) и Mono может использоваться как синхронный коммуникатор (с block методы) и как асинхронный (с subscribe методы).

Обратите внимание, что java.util.concurrent.CompletableFuture также может действовать как синхронный, так и асинхронный коммуникатор. Зачем иметь похожие средства, чтобы делать то же самое? Это явление называется не изобретено здесь.