想要限制线程池,这样它就不会';t最大CPU输出
本文关键字:输出 CPU 最大 线程 | 更新日期: 2023-09-27 18:25:19
我第一次用Threads编程。我的程序一次只显示少量数据;当用户浏览数据时,我希望它加载下一步可以访问的所有可能的数据,这样当用户切换到一个新的部分时,就会有尽可能小的延迟。
在最坏的情况下,我可能需要预加载6段数据。所以我用了一些类似的东西:
if (SectionOne == null)
{
ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(PreloadSection),
Tuple.Create(thisSection, SectionOne));
}
if (SectionTwo == null)
{
ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(PreloadSection),
Tuple.Create(thisSection, SectionTwo));
}
//....
以预加载每个区域。它在我有8个核心的主系统上运行得很好;但在我只有4个内核的测试系统上,整个系统在运行线程时会慢到爬行。
我想我想同时运行最多2个TotalCores线程。但我真的不知道。
寻求任何帮助,使其在多个系统设置(单核到8核或其他)上尽可能高效地运行。此外,我使用的是C#,这是一个可移植类库项目,所以我的一些选择是有限的。
我会使用这种内置的.NET并行魔法。
任务并行性
使用为您管理的任务操作,但您仍然可以控制选择所需的核心和线程数量。
示例:
const int MAX = 10000;
var options = new ParallelOptions
{
MaxDegreeOfParallelism = 2
};
IList<int> threadIds = new List<int>();
Parallel.For(0, MAX, options, i =>
{
var id = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine("Number '{0}' on thread {1}", i, id);
threadIds.Add(id);
});
如果你想的话,你甚至可以用扩展来做:
const int MAX_TASKS = 8;
var numbers = Enumerable.Range(0, 10000000);
IList<int> threadIds = new List<int>(MAX_TASKS);
numbers.AsParallel()
.WithDegreeOfParallelism(MAX_TASKS)
.ForAll(i =>
{
var id = Thread.CurrentThread.ManagedThreadId;
if (!threadIds.Contains(id))
{
threadIds.Add(id);
}
});
Assert.IsTrue(threadIds.Count > 2);
Assert.IsTrue(threadIds.Count <= MAX_TASKS);
Console.WriteLine(threadIds.Count);