Clojure惯用于线程之间的同步

时间:2013-02-04 17:06:49

标签: clojure

我尝试解决的方案如下:我有一个测试程序,可以将Web发送到系统上的Web端点。

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

为了达到这个目的,我希望测试运行器等待jetty处理程序在回调时设置的“事件”。

我想过使用java的CyclicBarrier,但我想知道在clojure中是否有一种惯用的解决方法。

由于

2 个答案:

答案 0 :(得分:6)

您可以使用最近询问过的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)

答案 1 :(得分:3)

在直接的Clojure中,使用跟踪优秀回调的代理是有意义的,但在实践中我建议使用Aleph,这是一个用于异步Web编程的甚至可以驱动处理程序相当容易。它生成环形处理程序,听起来很适合您现有的代码。