Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 命名该技术(它可能被称为';背驮';)_Algorithm_Language Agnostic_Nomenclature - Fatal编程技术网

Algorithm 命名该技术(它可能被称为';背驮';)

Algorithm 命名该技术(它可能被称为';背驮';),algorithm,language-agnostic,nomenclature,Algorithm,Language Agnostic,Nomenclature,以下方法/技术的名称是什么(我将尽我所能描述,可能需要“记忆化”的背景知识来理解为什么这种技术非常有用): 您启动了一些可能很长的异步计算,并且您意识到一个相同的计算已经启动,但尚未完成,并且您“背负”了第一次计算。然后,当第一次计算结束时,它发出的不是一次回调,而是两次回调 目标是不要不必要地开始第二次计算,因为您知道已经有相同的计算正在运行 请注意,尽管并非完全不同,但我并不是在寻找缓存的特殊情况,即“记忆化”是:当您启动一个计算并找到该计算的缓存(记忆化)结果时,您可以重复使用该计算 在这

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

您启动了一些可能很长的异步计算,并且您意识到一个相同的计算已经启动,但尚未完成,并且您“背负”了第一次计算。然后,当第一次计算结束时,它发出的不是一次回调,而是两次回调

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

请注意,尽管并非完全不同,但我并不是在寻找缓存的特殊情况,即“记忆化”是:当您启动一个计算并找到该计算的缓存(记忆化)结果时,您可以重复使用该计算

在这里,我在寻找一种技术的名称,它在某种程度上有点类似于记忆化(因为记忆化是一种有用的技术,出于同样的原因,它可能是有用的),除了它重用第一次计算的结果,即使第一次计算在发布第二次计算时还没有完成

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

事实上,我不止一次地用它作为某种“类固醇回忆录”,它非常方便

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

编辑


该死,我想对epatel的回答发表评论,但它消失了。epatel的回答给了我一个想法,这种技术可以被称为“惰性记忆”:(p>听起来像是未来:

听起来有点像,但不完全是…

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

这只是对未来的记忆

正常的“急切”回忆录是这样工作的:

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_memo(x):
  critical_section:
    if (exists answers(f,x))
      return answers(f,x)
    else
      a = f(x)
      answers(f,x) = a
      return a
  • 第一个线程调用f(3)
  • f(3)没有存储答案,因此在关键部分有一个对f(3)的调用。f(3)实现为返回未来,因此“答案”立即准备就绪;'上述代码中的a'设置为未来F,未来F存储在应答表中
  • 未来F作为调用F(3)的“结果”返回,该调用可能仍在进行中
  • 另一个线程调用f(3)
  • 从表中找到未来的F,并立即返回
  • 现在两个线程都可以处理计算结果;当他们试图读取它时,他们会阻塞,直到计算准备就绪——在文章中,这种通信机制被称为是通过回调实现的,假定是在未来不太常见的情况下

  • @罗伯特·哈维:谷歌搜索“线程取消”:)哼。。。我认为问题在于,线程取消有很多意义,根据实现的不同,您甚至可能根本不会启动第二个较长的异步线程,因为您直接在另一个线程上执行用于不同的上下文,但用于相同的想法:新员工利用其他人已经(或正在)支付的开销。不要因此而妨碍您查找或定义特定于您的上下文的工作。@Pascal Cuoq:在不同的上下文中,但在软件编程中,您的意思是?我知道我在什么地方见过,但是很久以前。我只是不记得是从哪里学来的。一个经过同步的未来缓存!可能是部分回忆录吗?你可以通过谷歌找到一些技术论文search@ergosys当前位置这比未来更复杂。例如,future用于显示进度条或计算结果。这是关于第一次计算的未来的第二次计算。这正是我阅读问题时的想法。期货并没有得到太多的使用,但它们很有前途(如果你得到像go coroutines这样的廉价线程)。@antti.huima:我想这取决于你喜欢什么:在等待未来时阻止两个(或更多)线程(这是Matthieu M的提示:你需要廉价线程)或轮询未来的“完成”或在完成时使用即时回调通知。我同意当它使用future实现时,它是“未来的记忆”,但future并不是唯一的实现方式。我使用的是更像“ProgressOrResultHandable”回调的东西,从消息传递的角度来看,它比将来更干净。无阻塞、无超时、无轮询。即时回调通知。@如果您是以事件驱动方式编程,那么cocotwo回调确实更干净。当线程和并行性很常见时,就使用未来,否则它们就没用了。例如,考虑:For(i=0;i