Назовите ту технику (это можно назвать, 'осуществив контрейлерные перевозки'),

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

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

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

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

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

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

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

Я просто не знаю что название этого (усовершенствованный?) техника.

Править

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

10
задан cocotwo 5 March 2010 в 00:06
поделиться

4 ответа

В некоторых случаях я слышал, что это называется «Объединение запросов».

2
ответ дан 4 December 2019 в 01:56
поделиться

Это просто мемоизация фьючерсов.

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

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) возвращает фьючерсы вместо фактических результатов, приведенный выше код работает как есть. Вы получаете эффект piggyback, т.е. примерно так:

  1. Первый поток вызывает f(3)
  2. Для f(3) нет хранимого ответа, поэтому в критической секции происходит вызов f(3). f(3) реализована как возврат будущего, поэтому "ответ" готов немедленно; 'a' в приведенном выше коде устанавливается в будущее F, а будущее F хранится в таблице ответов
  3. Будущее F возвращается как "результат" вызова f(3), который потенциально еще продолжается
  4. Другой поток вызывает f(3)
  5. Будущее F находится из таблицы и немедленно возвращается
  6. Теперь оба потока имеют ручки к результату вычисления; когда они пытаются прочитать его, они блокируются, пока вычисление не будет готово - в сообщении этот механизм связи был упомянут как реализованный с помощью обратного вызова, предположительно в контексте, где фьючерсы менее распространены
4
ответ дан 4 December 2019 в 01:56
поделиться

Звучит как будущее: http://en.wikipedia.org/wiki/Future_%28programming%29

2
ответ дан 4 December 2019 в 01:56
поделиться

Звучит немного как Ленивая оценка, но не совсем...

1
ответ дан 4 December 2019 в 01:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: