我正在研究在clojure中实现并发的不同方法,这些似乎是做同样事情的两种竞争方式,所以我想知道我应该在哪里使用每种技术.
Art*_*ldt 10
承诺更多地是在不同时间轴上的事件之间进行通信的一种方式.它们为一段代码提供了一种接收响应的方法,而不必担心提供答案的机制.原始代码路径可以创建一个promise并将其传递给单个线程中的两个不同的代码路径,或者分布式系统中的线程,代理或节点.然后,当其中一个线程/代理/引用需要答案时,它可以阻止承诺,而不必知道将履行承诺的实体的任何信息.当另一个线程/ agent/ref/other得出答案时,它可以履行承诺而不必知道有关等待承诺(或者还没有等待)的实体的任何信息.
promises是跨时间线的通信机制,独立于所使用的并发机制.
手表是一种指定在原子或ref发生变化时调用的函数的方法.这是一种向单个代理/ ref的所有未来状态传达意图的方式,通过说"嘿,确保此条件始终为真",或"在此处记录更改".
手表和承诺对于并发性非常有用,但适用于稍微不同的用途.您可能会发现要在同一应用程序中的不同位置使用它们.
如果您想要参考通知更改,请使用手表.例如,如果一个线程正在处理事件并更新ref以响应其中一些事件,则可以使用add-watch使系统的其他部分接收更新通知.单个手表可以随时间处理许多更新.
如果要将另一个线程传递给句柄以访问尚未计算的值,请使用promise .如果另一个线程试图取消引用promise,它们将阻塞,直到promise的计算完成(即原始线程通过"deliver"在promise中放置一个值).单一承诺仅用于一次 - 之后它只是一个固定值.