1

我正在使用支持 BlockingCollection 的生产者/消费者模式从文件中读取数据,解析/转换然后插入数据库。我拥有的代码与此处可以找到的代码非常相似:http: //dhruba.name/2012/10/09/concurrent-producer-consumer-pattern-using-csharp-4-0-blockingcollection-tasks/

但是,主要区别在于我的消费者线程不仅解析数据,还插入数据库。这一点很慢,我认为是导致线程阻塞。

在示例中,有两个消费者线程。我想知道是否有办法以某种智能的方式增加线程数?我原以为线程池会做到这一点,但似乎无法理解如何做到这一点。

或者,您将如何选择消费者线程的数量?2 对我来说似乎不正确,但我不确定最好的 # 会是什么。关于选择消费者线程数的最佳方式的想法?

4

1 回答 1

3

选择消费者线程数量的最佳方法是数学:计算每分钟有多少数据包来自生产者,然后将其除以单个消费者每分钟可以处理的数据包数量,您就可以很好地了解如何处理您需要的许多消费者。

BlockingCollection我通过添加另一个消费者将完成的数据包放入其中来解决阻塞输出问题(消费者在尝试更新数据库时阻塞) 。一个单独的线程读取该队列并更新数据库。所以它看起来像:

input thread(s) => input queue => consumer(s) => output queue => output thread

这具有使消费者与输出分离的额外好处,这意味着您可以优化输出或完全改变输出方法而不影响消费者。例如,这可能允许您批量更新数据库,这样您就可以通过一次调用更新十几个或一百个(或更多)记录,而不是对每条记录进行一次数据库调用。

我在我的文章Simple Multithreading, Part 2中展示了一个非常简单的示例(使用单个使用者)。这适用于文本文件过滤器,但概念是相同的。

于 2013-07-31T20:29:28.953 回答