Назовите эту технику (это можно назвать «спекуляцией») - PullRequest
10 голосов
/ 05 марта 2010

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

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

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

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

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

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

Я на самом деле использовал это не раз как своего рода «памятка о стероидах», и это очень удобно.

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

EDIT

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

Ответы [ 4 ]

4 голосов
/ 05 марта 2010

Это всего лишь запоминание фьючерса .

Нормальное «нетерпеливое» запоминание работает так:

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

  1. Первый поток вызывает f (3)
  2. Нет сохраненного ответа для f (3), поэтому в критическом разделе есть вызов f (3). f (3) реализован как возвращающий будущее, поэтому «ответ» готов немедленно; «a» в приведенном выше коде установлено для будущего F, а будущее F сохраняется в таблице ответов
  3. Будущий F возвращается как «результат» вызова f (3), который потенциально все еще продолжается
  4. Другой поток вызывает f (3)
  5. Будущее F найдено из таблицы и немедленно возвращено
  6. Теперь оба потока имеют указатель на результат вычисления; когда они пытаются прочитать его, они блокируются до тех пор, пока вычисление не будет готово - в посте этот механизм связи упоминался как реализованный с помощью обратного вызова, предположительно в контексте, где фьючерсы менее распространены
2 голосов
/ 05 марта 2010

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

2 голосов
/ 05 марта 2010

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

1 голос
/ 05 марта 2010

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

...