避免消费者/生产者类的并发问题[关闭]
Posted
技术标签:
【中文标题】避免消费者/生产者类的并发问题[关闭]【英文标题】:Avoid concurrency issues with consumer / producer classes [closed] 【发布时间】:2018-01-15 23:57:13 【问题描述】:所以,我正在构建一个包含对象列表的控制台应用程序。
每 1000 毫秒,“生产者”会执行一次 HTTP 请求并根据结果创建一个新对象,并将其添加到对象列表中。
每 1000 毫秒,“消费者”就会分析列表中的所有对象。
每 2000 毫秒,另一个“消费者”正在分析列表中的所有对象。
每 3500 毫秒,另一个“消费者”正在分析列表中的所有对象。
偶尔,在任意时间,我想问一位消费者,这些分析数据的结果是什么。
所以这听起来像是经典的生产者/消费者模式。在 javascript 中这不是问题,因为它是非阻塞的。但是C#呢?我认为这可能是一场并发噩梦。据我所知,这不能简单地使用任务来完成,因为您无法控制它是在同一个线程上下文中运行,还是在新线程中运行。
我正在寻找完成上述案例的“最简单”的方法。我研究过 TPL Dataflow 之类的东西,也被认为是一种使用 deltatime 进行简单“事件循环”的模式(例如在视频游戏中),您有什么建议?
最好的问候,
【问题讨论】:
“在 JavaScript 中这不是问题,因为它是非阻塞的” -- 不知道这意味着什么。 “非阻塞”并不意味着“没问题”。 “我认为这可能是一场并发噩梦”——如果做得正确,就不应该有“噩梦”。操作不当,任何类型的并发操作算法都可能是一个大问题,JavaScript、C# 或任何其他语言。 “这不能简单地用任务来完成,因为你无法控制它是在同一个线程上下文中运行,还是在一个新线程中运行”——为什么“同一个线程上下文或一个新线程”很重要? 使用 Rx。工作完成 对不起,我的意思是非阻塞和单线程。它可能无法解决所有问题,但如果没有锁、死锁问题、并发异常等,它肯定会更简单(不知道并发异常是否是 C# 中的东西,我已经习惯了 Java)。我所说的“噩梦”是指并发作为一个主题的复杂性,可能是单词的错误使用:)。如果可能的话,我想避免直接处理多线程,因此我的问题。 Rx 看起来很有趣,谢谢,我会看看 :) "...我的意思是非阻塞和单线程..." - 不可能 【参考方案1】:您可以使用像BlockingCollection<T>
这样实现接口IProducerConsumerCollection<T>
的安全集合。
您可以阅读更多关于线程安全集合的信息here。
【讨论】:
以上是关于避免消费者/生产者类的并发问题[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Kafka在高并发的情况下,如何避免消息丢失和消息重复?kafka消费怎么保证数据消费一次?数据的一致性和统一性?数据的完整性?