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