Ted*_*sen 11 .net multithreading task-parallel-library
有没有什么理由让.NET随着时间的推移减少并行线程的数量?
我在许多通行证中运行计算需要数天才能完成(每次通过需要约1小时).任务是内存中数据的纯计算(从磁盘读取).我正在使用Parallel.For
和Parallel.ForEach
几个地方,主要任务和任务内部.许多过程中都会重复所有事情.每次传递都会正确处理类实例(内存分析器不会显示任何问题),并创建新实例.它在每次传递中重复100%相同的任务,但数学中的某些数字被更改(每次迭代的数量相同,相同的数据集).
计算机有六个核心,应用程序首先使用它们.一段时间后,它使用5,然后是4,然后是3,然后是2.查看并行堆栈(Debug-> Window-> Parallel stacks),它确认只有那么多正在运行.
为什么.NET没有在每次传递中最大化线程数?它是否根据CPU使用情况调节线程?
关于如何调试的提示?我可以强制使用多少个线程吗?
我相信这篇关于ThreadPool并发的文章应该提供一些线索。
由 Parallel 方法创建的任务最终将由 ThreadPool 执行。ThreadPool 使用的理想线程数根据正在执行的任务类型而变化。如果任务阻塞很多并且没有太多争用,则更多的线程数将导致更高的吞吐量。对于没有太多阻塞且对有限资源争用较多的任务,较少数量的线程将导致较高的吞吐量。
由于此属性,.NET 4 中的 ThreadPool 实现了一种“爬山”算法,它调整 ThreadPool 正在运行的线程数并根据测量的吞吐量做出反应。
因此,您可以检查的一件事是查看实际作业吞吐量是否随着线程数量的减少而减少。也有可能当你的应用程序运行时,它在磁盘操作上遇到越来越多的瓶颈,并且线程只是因为不使用而被关闭。
至于强制ThreadPool使用一定数量的线程,我认为这是不可能的。有ThreadPool.SetMinThreads但这对我来说从来没有用过。一般来说,.NET 将忽略这些值并使用它想要的任意数量的线程。
归档时间: |
|
查看次数: |
219 次 |
最近记录: |