使用多线程的Producer/2consumers实现

本文关键字:2consumers 实现 Producer 多线程 | 更新日期: 2023-09-27 18:13:30

我想实现"生产者/两个消费者"的功能。

Producer:递归扫描目录并将目录信息添加到一些存储(我猜是Queue<>)

Consumer 1:检索目录数据并将其写入xml文件

Consumer 2:检索目录的数据并将其添加到TreeNode中。

所以(1和2)消费者必须使用相同的数据。因为如果其中一个消费者调用Dequeue(),另一个将错过此数据。

我唯一的想法是制作2个不同的Queue<>和生产者将用相同的数据填充它们。然后,每个消费者将使用不同的Queue对象。

我希望你能提出一些更有吸引力的建议

使用多线程的Producer/2consumers实现

LMAX Disruptor是解决此问题的一种方法。

文章:http://martinfowler.com/articles/lmax.html

单生产者、多线程的消费者环缓冲区示意图:http://martinfowler.com/articles/images/lmax/disruptor.png

假设你需要很好的——接近专家级的——知识,了解原子指令和无锁算法是如何在你的目标平台上工作的。


下面的描述与LMAX不同,我根据OP的场景进行了调整。

底层结构可以是环缓冲区(固定容量),也可以是无锁链表(无限容量,但仅在支持某些类型的多字原子指令的平台上可用)。

制片人只会把东西推到前面。

每个消费者都有一个迭代器指向他们正在处理的项目。每个消费者都以自己的速度推进自己的迭代器。

除了消费者之外,还有一个尾随的垃圾收集器,它也会尝试前进,但它不会超越消费者的任何迭代器。因此,它最终将清除两个消费者都已完成处理的项,并且只清除这些项。

您可以使用ZeroMQ,它内置了此功能(以及更多)-
http://learning-0mq-with-pyzmq.readthedocs.org/en/latest/pyzmq/patterns/pushpull.html

上面的例子是Python代码,但有。net绑定-
http://zeromq.org/bindings: clr