【发布时间】:2011-02-15 03:28:15
【问题描述】:
我是 clojure 的新手,我正在尝试了解如何正确使用它的并发功能,因此感谢任何批评/建议。 所以我正在尝试用 clojure 编写一个小测试程序,其工作原理如下:
- 有 5 个生产者和 2 个消费者
- 生产者等待随机时间,然后将一个数字推送到共享队列。
- 消费者应在队列非空时立即从队列中取出一个号码,然后短时间休眠以模拟工作
- 当队列为空时,消费者应该阻塞
- 当队列中有超过 4 个项目时,生产者应该阻塞,以防止它变得庞大
这是我对上述每个步骤的计划:
- 生产者和消费者将成为并不真正关心他们的状态的代理(只是 nil 值或其他东西);我只是在某个时候使用代理发送“消费者”或“生产者”功能。那么共享队列将是(def queue (ref []))。也许这应该是一个原子?
- 在“生产者”代理函数中,只需将 (Thread/sleep (rand-int 1000)) 和 (dosync (alter queue conj (rand-int 100))) 推入队列。
- 我正在考虑让消费者代理使用 add-watcher 观察队列的变化。虽然不确定这一点..它会在任何更改时唤醒消费者,即使更改来自消费者拉出某些东西(可能使其为空)。也许在观察者函数中检查这一点就足够了。我看到的另一个问题是,如果所有消费者都很忙,那么当生产者向队列中添加新内容时会发生什么?观看的事件是在某个消费者代理上排队还是消失了?
- 见上文
- 我真的不知道该怎么做。我听说 clojure 的序列可能有用,但我找不到足够的文档来说明如何使用它,而且我的初始测试似乎不起作用(抱歉我身上没有代码了)
【问题讨论】:
标签: clojure