10

以下方法/技术的名称是什么(我会尽力描述最好的,可能需要“记忆化”的背景才能理解为什么这种技术非常有用):

你开始了一些可能很长的异步计算,你意识到一个相同的计算已经开始但还没有完成,你在第一次计算上“捎带”。然后当第一个计算结束时,它发出的不是一个而是两个回调。

目标是不要不必要地开始第二次计算,因为您知道已经有一个相同的计算正在运行。

请注意,虽然并非完全不同,但我并不是在寻找“记忆化”是缓存的特殊情况:记忆化是当您开始计算并找到已经完成的相同计算的缓存(记忆化)结果时,您可以重用。

在这里,我正在寻找与记忆化有点相似的技术的名称(因为记忆化是一种有用的技术的某些相同原因,它可能很有用),除了它重用的结果即使在您发出第二次计算时第一次计算尚未完成,第一次计算也是如此。

我一直将这种技术称为“piggybacking”,但我不知道这是否正确。

实际上,我不止一次使用它作为某种“类固醇记忆”,它非常方便。

我只是不知道这种(高级?)技术的名称是什么。

编辑

该死的,我想评论 epatel 的答案,但它消失了。epatel 的回答给了我一个想法,这种技术可以称为“惰性记忆” :)

4

4 回答 4

4

这只是期货的记忆。

正常的“渴望”记忆是这样工作的:

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. 现在两个线程都处理了计算结果;当他们尝试读取它时,他们会阻塞直到计算准备好——在帖子中提到了这种通信机制是由回调实现的,大概是在期货不太常见的情况下
于 2010-03-05T05:39:06.603 回答
2

Sounds like a future: http://en.wikipedia.org/wiki/Future_%28programming%29

于 2010-03-04T23:31:04.097 回答
2

在某些情况下,我听说这称为“请求合并”。

于 2010-03-05T00:10:53.910 回答
1

Sounds a little like Lazy Evaluation, but not exactly...

于 2010-03-04T23:32:17.717 回答