Подтвердить что ты не робот

Назовите эту технику (ее можно назвать "копированием" )

Как называется следующий метод/метод (я попытаюсь описать лучшее, что мог, предположение о "memoization", вероятно, необходимо для понимания того, почему этот метод может быть очень полезным):

Вы запускаете несколько потенциально длинных асинхронных вычислений, и понимаете, что идентичные вычисления уже запущены, но еще не выполнены, и вы "контрейлерные" при первом вычислении. Затем, когда заканчивается первое вычисление, он выдает не один, а два обратных вызова.

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

Обратите внимание, что, несмотря на то, что вы не совсем похожи, я не ищу конкретный случай кэширования, который "memoization": memoization - это когда вы начинаете вычисление и находите кешированный (memoized) результат того же самого вычисления, которое уже сделано что вы можете повторно использовать.

Здесь я ищу имя метода, который немного похож на memoization (тем, что он может быть полезен по тем же причинам, что memoization - полезный метод), за исключением того, что он повторно использует результат первого вычисления, даже если первое вычисление еще не выполнено в то время, когда вы произвели второе вычисление.

Я всегда называл эту технику "копированием", но я не знаю, правильно ли это.

Я действительно использовал это более одного раза как своего рода "memoization on steroids", и это очень удобно.

Я просто не знаю, как называется это (продвинутое?).

ИЗМЕНИТЬ

Черт, я хотел прокомментировать эпатель, но он исчез. epatel ответ дал мне идею, эту технику можно было бы назвать "ленивой записью":)

4b9b3361

Ответ 1

Это просто memoization фьючерсов.

Обычная "нетерпеливая" memoization работает следующим образом:

f_memo(x):
  critical_section:
    if (exists answers(f,x))
      return answers(f,x)
    else
      a = f(x)
      answers(f,x) = a
      return a

Теперь, если f (x) возвращает фьючерсы вместо фактических результатов, приведенный выше код работает как есть. Вы получаете эффект контрейлеризации, например:

  • Первый поток вызывает f (3)
  • Нет сохраненного ответа для f (3), поэтому в критическом разделе есть вызов f (3). f (3) реализуется как возвращение будущего, поэтому "ответ" готов немедленно; "a" в приведенном выше коде устанавливается в будущее F, а будущее F сохраняется в таблице ответов
  • Будущее F возвращается как "результат" вызова f (3), который потенциально все еще продолжается
  • Другой поток вызывает f (3)
  • Будущее F найдено из таблицы и немедленно возвращается
  • Теперь оба потока имеют дескриптор результата вычисления; когда они пытаются его прочитать, они блокируются до тех пор, пока вычисление не будет готово - в сообщении этот механизм связи упоминается как реализуемый обратным вызовом, предположительно в контексте, где фьючерсы менее распространены.

Ответ 3

В некоторых контекстах я слышал это под названием "Слияние запросов".

Ответ 4

Звучит немного как Lazy Evaluation, но не совсем...