我是clojure的新手,我正在尝试理解如何正确使用它的并发功能,所以任何批评/建议都值得赞赏.所以我试图在clojure中编写一个小测试程序,其工作方式如下:
- 有5个生产者和2个消费者
- 生产者等待随机时间,然后将数字推送到共享队列.
- 一旦队列非空,消费者应该从队列中拉出一个数字,然后在短时间内休眠以模拟工作
- 消费者应该在队列为空时阻止
- 生产者应该阻止队列中有超过4个项目,以防止它增长巨大
以下是我对上述每个步骤的计划:
- 生产者和消费者将是不真正关心他们的国家的代理人(只是零值或某事); 我只是使用代理发送一个"消费者"或"生产者"功能来做某个时间.然后共享队列将是(def队列(ref [])).也许这应该是一个原子呢?
- 在"producer"代理函数中,简单地(Thread/sleep(rand-int 1000))然后(dosync(alter queue conj(rand-int 100)))推入队列.
- 我想让消费者代理使用add-watcher观察队列的变化.虽然不确定这一点,但它会让消费者在任何变化中醒来,即使变化来自消费者拉动某些东西(可能使其变空).也许在观察者功能中检查这一点就足够了.我看到的另一个问题是,如果所有消费者都很忙,那么当生产者向队列添加新内容时会发生什么?观看的事件是否在某个消费者代理上排队或者是否消失了?
- 往上看
- 我真的不知道该怎么做.我听说clojure的seque可能有用,但我找不到足够的doc如何使用它,我的初始测试似乎不起作用(抱歉我的代码不再有了)