【问题标题】:Clojure idiomatic for synching between threads用于线程之间同步的 Clojure 惯用语
【发布时间】:2013-01-19 10:40:32
【问题描述】:

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

这个测试程序有一个在其上运行的码头网络服务器,它期望来自外部系统的回调,以完成一个成功的测试周期。如果在特定时间范围(超时)内没有收到回调,则测试失败。

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

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

谢谢

【问题讨论】:

    标签: clojure


    【解决方案1】:

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

    【讨论】:

    • 感谢您的指点。实际上,lamina 看起来可以解决这种情况。
    • 我同意。出于这些目的,Lamina 的重量要轻一些。 ps 是 github.com/ztellman/lamina 供未来的读者阅读。
    【解决方案2】:

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

    【讨论】:

    • 谢谢!我最初考虑使用 Promise,但我专注于使用 @ 取消引用,并且不知道 deref 可能会超时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    相关资源
    最近更新 更多