gpt4 book ai didi

c# - PLINQ:如何在超过 4 个线程上运行 ParallelQuery?

转载 作者:太空狗 更新时间:2023-10-29 23:02:34 27 4
gpt4 key购买 nike

更新 - 更改了问题的标题以反射(reflect)我真正想要的

考虑以下代码:

// this query generates 12 instances of Func<int>, which each when executed
// print something to the console and wait for 1 second.
var actions = Enumerable.Range(0, 12).Select(i => new Func<int>(() =>
{
Console.WriteLine("{0} - waiting 1 sec", i);
Thread.Sleep(1000);
return 1;
}));

// define a parallel query. Note the WithDegreeOfParallelism call here.
var query = from action in actions.AsParallel().WithDegreeOfParallelism(12)
select action();

// execute, measuring total duration
var stopw = Stopwatch.StartNew();
query.ToList();
Console.WriteLine(stopw.Elapsed);
Console.WriteLine(Environment.ProcessorCount); // 3 on my machine

当省略对 WithDegreeOfParallelism 的调用时,这将分 4 个 block 执行,总共花费大约 4 秒,这是我预期的结果,因为我的 CPU 数量是 3。

但是,当使用任何大于 4 的数字调用 WithDegreeOfParallelism 时,我总是得到 3 个 block ,并且总持续时间不低于 3 秒。我希望值 12 的总持续时间(略多于)1 秒。

我错过了什么?我如何才能强制并行执行 4 个以上的非 CPU 密集型任务,这正是我所追求的?

更新:我当然可以回到手动启动线程,但我希望新的 PFX 库能让这更容易一些......无论如何,下面的代码给了我大约 1 秒的总执行时间

List<Thread> threads = new List<Thread>();
for (int i = 0; i < 12; i++)
{
int i1 = i;
threads.Add(new Thread(() =>
{
Console.WriteLine(i1);
Thread.Sleep(1000);
}));
}
threads.ForEach(t => t.Start());
threads.ForEach(t => t.Join());

最佳答案

尝试使用选项 TaskCreationOptions.LongRunning 在并行循环中启动新任务。它们将立即开始,而不是等到线程池中的线程可用。

关于c# - PLINQ:如何在超过 4 个线程上运行 ParallelQuery?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6843820/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com