使用多线程的Producer/2consumers实现
本文关键字:2consumers 实现 Producer 多线程 | 更新日期: 2023-09-27 18:13:30
我想实现"生产者/两个消费者"的功能。
Producer:递归扫描目录并将目录信息添加到一些存储(我猜是Queue<>
)
Consumer 1:检索目录数据并将其写入xml文件
Consumer 2:检索目录的数据并将其添加到TreeNode中。
所以(1和2)消费者必须使用相同的数据。因为如果其中一个消费者调用Dequeue()
,另一个将错过此数据。
我唯一的想法是制作2个不同的Queue<>
和生产者将用相同的数据填充它们。然后,每个消费者将使用不同的Queue
对象。
我希望你能提出一些更有吸引力的建议
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