Clojure用于线程间同步的惯用方法

Clojure用于线程间同步的惯用方法,clojure,Clojure,我尝试解决的场景如下,我有一个测试程序,可以将一个web连接到系统上的一个web端点 此测试程序有一个jetty web服务器,在该服务器上运行,它期望外部系统的回调完成一个成功的测试周期。如果在特定时间范围(超时)内未收到回调,则测试失败 为了实现这一点,我希望测试运行程序等待jetty处理程序在回调时设置的“事件” 我曾想过使用java的CyclicBarrier,但我想知道clojure中是否有一种惯用的方法来解决这个问题 谢谢您可以使用您最近询问的promise:)类似这样的内容: (d

我尝试解决的场景如下,我有一个测试程序,可以将一个web连接到系统上的一个web端点

此测试程序有一个jetty web服务器,在该服务器上运行,它期望外部系统的回调完成一个成功的测试周期。如果在特定时间范围(超时)内未收到回调,则测试失败

为了实现这一点,我希望测试运行程序等待jetty处理程序在回调时设置的“事件”

我曾想过使用java的CyclicBarrier,但我想知道clojure中是否有一种惯用的方法来解决这个问题


谢谢

您可以使用您最近询问的
promise:)类似这样的内容:

(def completion (promise))

; In test runner.
; Wait 5 seconds then fail.
(let [result (deref completion 5000 :fail)]
   (if (= result :success) 
     (println "Great!") 
     (println "Failed :(")))

; In jetty on callback
(deliver completion :success)

在straight Clojure中,使用跟踪未完成回调的代理是有意义的,尽管在实践中我建议使用,这是一个异步web编程库,即使是驱动处理程序也非常容易。它会生成环处理程序,听起来它很适合您现有的代码。

谢谢!我最初考虑使用承诺,但我专注于使用@取消引用,不知道deref可能需要一段时间。谢谢你的提示。事实上,薄板看起来可以解决这个问题,我同意。出于这些目的,薄板的重量稍微轻一点。ps,这是给未来读者的。