【发布时间】:2017-03-02 21:07:18
【问题描述】:
我有一个 IEnumerable,其中包含许多需要并行处理的项目。这些项目不是 CPU 密集型的。 理想情况下,这些项目应该在 100 个或更多线程上同时执行。
我已尝试使用 Parallel.ForEach() 来完成此操作。这行得通,但问题是新线程的生成速度太慢。 Parallel.Foreach() 达到 100 个线程需要(太)长时间。我知道有一个 MaxDegreeOfParallelism 属性,但这是最大值,而不是最小值。
有没有办法在 100 个线程上立即执行 foreach? ThreadPool.SetMinThreads 是我们更愿意避免的,因为它对整个进程都有影响。
是否有使用自定义分区器的解决方案?
【问题讨论】:
-
好吧,
Parallel.ForEach使用线程池,所以可以玩,但这是规则,所以SetMinThreads似乎是唯一的选择(如果你想专门使用Parallel.ForEach)。 -
您能否提供一个示例来展示您的处理 的含义。是受 IO 限制/受 CPU 限制,是多步骤进程吗……等等?
-
但是,如果您的任务不是 CPU 密集型(因此 - 主要是 IO 密集型) - 您可以使用 async\await 结合 SemaphoreSlim 来限制并发,例如这里stackoverflow.com/a/10810730/5311735(但不要' t 像那里那样使用 Task.Run(await ...)。
-
如果您的操作不是 CPU 密集型操作那么您一开始就不应该创建额外的线程。创建一堆线程只是让它们无所事事(因为您显然没有工作要做)将使您的代码更慢,并消耗更多资源,而不是更快。
-
在 4 个内核上同时运行 100 个线程比一次使用 4 个线程需要更长的时间,因为在线程之间切换会涉及成本。 但是我建议你自己尝试一下,也许你确实有 100 多个内核。
标签: c# multithreading parallel-processing task-parallel-library