【发布时间】:2021-05-18 04:32:46
【问题描述】:
我有一个 BlockingCollection,我从一个线程写入并从另一个线程读取。 生产者线程获取从服务器接收的项目并将它们添加到 BlockingCollection,而读取线程尝试清空 BlockingCollection 并处理它们。
我正在尝试批量清空队列的问题,因为一个一个处理它们会太慢。但是当它不断被写入(数千个项目)时,消费者线程会一直读取它们直到它被清空,这意味着在写入完成之前处理甚至不会开始。
现在,消费者中的处理可以并行完成,所以我一直在想如何去做。
目前我有两个想法:
-
从消费者中的 BlockingCollection 读取一定数量的项目后,启动一个新的并行作业来处理它们,而不是等待完全清空队列然后开始处理。
-
使用多个消费者并希望它们并行运行,而不是在尝试同时读取 BlockingCollection 时不断地相互阻塞。
所以我的问题是关于选项 2 - BlockingCollection 是否针对这种情况进行了内部优化?它会划分读取的区域,还是消费者会为每个项目争吵?如果是这样,那选项 1 更胜一筹?
【问题讨论】:
-
Fildor 是在建议选项 1,确定吗?
-
But when it's being constantly written to (thousands of items), then the consumer thread keeps reading them until it's emptied, which means that the processing will not even start until the writing is done.这句话我读了好几遍了,不知道是什么意思。 -
@Fildor 啊,在这种情况下,OP 应该“停止这样做”。 :)
-
Use multiple consumers and hope that they will run in parallel instead of just constantly blocking each other while trying to read the BlockingCollection at the same time.这确实是它的工作,所以我认为它会没事的。但可以确定的是个人资料。如果有问题,请让单个消费者将条目批量输入List<entry>,然后将它们添加到 secondBlockingCollection(由多个阅读器使用)以减少争用。但老实说,这不太可能需要。 -
在您跳转到更多定制解决方案之前,您为什么不尝试对您的当前解决方案进行简单修复,该解决方案现已由 2 个用户提出建议?如果这不让您满意,您为什么不采取相反的方式,尝试由非常聪明的人和数十名测试人员创建的更高抽象,并且已经在该领域使用了几年?跨度>
标签: c# multithreading concurrency blockingcollection