【发布时间】:2018-09-24 22:55:19
【问题描述】:
为了获得一些良好的并发编程实践,我正在尝试使用 Clojure 的 core.async 库来实现生产者/消费者模式。一切运行良好,但我希望能够在某个时间点同时停止生产者和消费者。
我当前的代码看起来像这样......
(def c (a/chan 5))
(def alive (atom true))
(def producer (a/go-loop []
(Thread/sleep 1000)
(when @alive
(a/>! c 1)
(recur))))
(def consumer (a/go-loop []
(Thread/sleep 3000)
(when @alive
(println (a/<! c))
(recur))))
(do
(reset! alive false)
(a/<!! producer)
(a/<!! consumer))
不幸的是,“do”块似乎有时会无限期地阻塞。我本质上希望能够阻止两个循环继续并阻塞,直到两个循环都退出。线程/睡眠代码用于模拟执行某些工作单元。
我怀疑停止生产者会导致消费者停车,因此挂起,尽管我不确定其他方法,有什么想法吗?
【问题讨论】:
标签: asynchronous clojure core.async