问题:函数 A 已进行缓存。函数 B 在其他方面计算函数 A 的有效函数调用,而从未调用 A。我们希望在 B 中利用这一效果来进一步减少 A 的计算量。如果我们预计 B 的执行速度比 A 快,我们还希望调用 A 的人等待对应的 B 执行。
B 中实现此操作的一个期望操作是
(spoof A args calc)
其中 calc 是一个零参数的 fn,它产生一个值等于 (apply A args)。这允许调用者将 calc 需要执行的恰好是预期的比 A 更快的工作量。
Spoof 返回 calc 返回的内容,或者在缓存命中的情况下,返回给定的参数缓存的值。例如,如果之前的调用已经在 (spoof A args calc) 调用之前发生了 (A args),则不会调用 calc。
在已经获得 (A args) 的结果,并且不希望被 (A args) 的并发调用阻塞的情况下,期望的操作是
(spoof-unsynchronized A args val)
它立即返回 val 并很快更新 A 的缓存。由于非同步欺骗是一个非常快的操作,它本质上会与 (A args) 的调用发生竞争条件,因此不需要阻塞 (A args) 的调用。(所以直接对内部缓存状态进行一次 swap! 就足够了)。