当前位置: 首页 > 编程语言 > C#

Disruptor示例,包含1个发布者和4个并行使用者分享

时间:2023-04-10 22:21:42 C#

C#学习教程:Disruptor示例,包括1个发布者和4个并行消费者例子这么慢?(在问题的最后)有1个发布者发布项目和1个消费者。但就我而言,消费者工作要复杂得多,需要一些时间。所以我想要4个并行处理数据的消费者。因此,例如,如果生产者产生数字:1,2,3,4,5,6,7,8,9,10,11..我希望消费者1赶上1,5,9,...消费者2赶上2,6,10,...consumer3captures3,7,11,...consumer4captures4,8,12...(不完全是这些数字,想法是数据应该并行处理,我不不关心哪个数字在哪个消费者中处理)并记住这需要并行完成,因为在实际应用程序中,消费者的工作非常昂贵。我希望消费者能够在不同的线程中执行以使用多核系统的特性。当然我可以创建4个环形缓冲区并将1个消费者连接到1个环形缓冲区。这样我就可以使用原始示例。但我认为这是不正确的。可能创建1个发布者(1个环形缓冲区)和4个消费者是正确的——因为这就是我所需要的。在Google组中添加一个非常相似的问题的链接:https://groups.google.com/forum/#!msg/lmax-disruptor/-CLapWuwWLU/GHEP4UkxrAEJ所以我们有两个选择:编辑:我忘了说代码部分取自常见问题解答。我不知道这种方法比Frank的建议好还是坏。遗憾的是该项目记录不当,看起来不错。无论如何尝试以下剪辑(基于您的第一个链接)–在单声道上测试,似乎没有问题:usingSystem;使用System.Threading.Tasks;使用干扰器;使用Disruptor.Dsl;namespaceDisruptorTest{publicsealedclassValueEntry{publiclongValue{get;放;}}publicclassMyHandler:IEventHandler{privatestaticint_consumers=0;私有只读int_ordinal;publicMyHandler(){this._ordinal=_consumers++;}publicvoidOnNext(ValueEntrydata,longsequence,boolendOfBatch){if((sequence%_consumers)==_ordinal)Console.WriteLine("事件处理:值={0},事件{1}由{2}处理",data.Value,sequence,_ordinal);elseConsole.WriteLine("事件{0}被{1}拒绝",sequence,_ordinal);}}classProgram{privatestaticreadonlyRandom_random=newRandom();私有常量SIZE=16;//必须是2的倍数privateconstintWORKERS=4;staticvoidMain(){vardisruptor=newDisruptor.Dsl.Disruptor(()=>newValueEntry(),SIZE,TaskScheduler.Default);为我我=0;i根据环形缓冲区的规范,您会看到每个消费者都会尝试处理您的ValueEvent,而在您的情况下您不会。我是这样解决的:添加一个处理ValueEvent的字段,当消费者接受他在该字段上测试的事件时,如果已经处理,他将ValueEvent继续到下一个字段。这不是最漂亮的方式,但它是缓冲区的工作方式。以上为C#学习教程:Disruptor实例,包括1个发布者和4个并行用户分享的全部内容。如果对你有用,需要了解更多C#学习教程,希望大家多加关注——本文来自网络合集,不代表立场,如涉及侵权,请点击有权联系管理员删除。如需转载请注明出处: