这是当前的代码版本,它执行非常简单的任务。它启动10个go例程,每个例程将10条消息添加到通道中。另一端是一个while true循环,它读取通道并在每500毫秒超时一次。
我在考虑使用更好的方式。我认为while true循环可以替换为一个recur,其中它读取通道,在每次成功读取后返回以再次读取。如果发生超时,它只终止执行。
我有两个问题: - 这是正确的方法吗? - 如何使用惯用的Clojure实现它?
我在考虑使用更好的方式。我认为while true循环可以替换为一个recur,其中它读取通道,在每次成功读取后返回以再次读取。如果发生超时,它只终止执行。
我有两个问题: - 这是正确的方法吗? - 如何使用惯用的Clojure实现它?
(defn -main [& args]
(let [c (async/chan)]
(doseq [i (range 10)]
(async/go
(doseq [j (range 10)]
(Thread/sleep (rand-int 1000))
(async/>! c (str i " :: " j)))))
(while true
(async/<!!
(async/go
(let [[result source] (async/alts! [c (async/timeout 500)])]
(if (= source c)
(println "Got a value!" result)
(println "Timeout!"))))))))
Thread/sleep
的任何情况都是一种代码异味 -- 这样做只会无端地占用线程池资源。我想不出任何场景下使用timeout
的<!
或<!!
不是更合适的选择。 - Charles Duffy