【发布时间】:2021-02-02 23:57:15
【问题描述】:
我有一个需要处理的数据队列的场景。所有数据都被一个线程读入内存并存储到ConcurrentQueue<T> 中,而另一个线程开始出列并处理数据。 T 是一个自定义类,需要处理大量数据。
读取器线程填充队列的一侧,而处理器线程在队列的另一侧工作。使用两个线程,这可以完美地工作。处理数据所花费的工作/时间大约是将数据加载到内存中的 4 倍。所以我一直在尝试增加处理线程的数量。问题是处理后的数据需要按照读取的顺序保存。显然,让多个线程并行处理不同的数据意味着它们不会同时完成。由于 ConcurrentQueue,线程确实按顺序读取数据,并且它们以正确的顺序将数据出队,但我还没有找到一种方法来同步线程的“保存”功能,以确保每个线程将“保存”在他们出列的顺序相同。
我知道 .NET 包含大量线程帮助程序,并且我研究过诸如 Monitor 和 Barrier 之类的东西,但它们的差异如此之大,以至于我不确定哪个帮助程序类或哪种方法最适合。
有人有什么建议或想法吗?
【问题讨论】:
-
塑造你的东西,让它可以无序工作?
-
不幸的是,我不能。我正在读取一个需要在处理后按顺序保存的顺序文件。
-
但是没有什么能阻止你处理/保存它的“块”,对吧?
-
只需在数据中添加一个序列号。问题解决了。