【发布时间】:2014-05-30 22:21:24
【问题描述】:
我正在使用 BlockingCollection 处理一些文件,然后将它们上传到服务器。
现在我有一个 Producer 递归文件系统并将某些文件压缩到临时位置。一旦它完成了一个文件,它会将我自己的对象添加到 BlockingCollection 中,其中包含诸如文件名、文件路径、修改日期等信息。消费者然后抓住这个对象并使用它来上传文件。当 Producer 完成搜索文件系统并处理文件后,它会调用 BlockingCollection.CompleteAdding() 方法向 Consumer 发出它已经完成的信号。
我想做的是将生产者的数量增加到 2 个或更多。原因是压缩过程需要一段时间,在多核处理器上我只利用 1 个核心。这会导致生产者有时会在更快的网络上落后于消费者。
我的问题是,当我有多个生产者且只有一个消费者时,我如何向消费者发出所有生产者都已完成工作的信号?如果我在其中一个生产者上调用 BlockingCollection.CompleteAdding() 方法,我仍然可以让一个或多个其他生产者仍在工作。
【问题讨论】:
-
将压缩分担给消费者并让生产者尽可能瘦可能更有益。
-
同意 Babcock 的观点,在 aprallel 中递归目录树只会阻塞文件系统。最好将要处理的文件位置添加到队列中,然后并行压缩和发送。密切关注您的 HDD 吞吐量。同时读取多个位置将导致它将磁头跨磁盘移动到不同的扇区。在那个时候它不会读取数据,因此会降低磁盘吞吐量。理想情况下,您仍然会在 1 个线程上读取,将每个文件读入一个字节 [],然后压缩并并行发送。
-
对不起,我应该在我的原始帖子中更清楚。只有一个递归线程可以提供 2 个或更多压缩(生产者)任务,然后再提供单个消费者任务。我正在使用高压缩,即使在快速处理器上也需要相当多的时间。每个线程每秒最多写入大约 2MB 的数据。
标签: c# blockingcollection