Delphi Parallel.For 是否有 MaxParallism
Does Delphi Parallel.For have a MaxParallism
在C#中,可以限制线程数,像这样:
Parallel.For(0, 10, new ParallelOptions { MaxDegreeOfParallelism = 4 }, count =>
{
Console.WriteLine(count);
});
Delphi 是否在最新的编译器中有这个,例如柏林。或者 omnithreadlibrary 有这个吗?
使用Parallel.For
overload that accepts a TThreadPool
, and supply a thread pool that limits the number of threads. That is done with the SetMaxWorkerThreads
方法。
请注意,我是通过阅读 documentation 获得此信息的。
Or does the omnithreadlibrary have this?
它也有。
如果您从 Parallel.For
构造函数开始,那么您将获得具有 .NumTasks
方法的 IOmniParallelSimpleLoop
接口,默认为 CPU 核心数。如果您使用 .NoWait
调用将循环与当前执行线程分离,它可能会被调整。
无论您从 Parallel.ForEach
生成器开始,您都会获得 IOmniParallelLoop
接口并且它也有 NumTasks
。
参见 http://otl.17slon.com/book/chap04.html#highlevel-for
中的第 2.12.4 和 2.11.1 章
有关预期调用语法的一般概念,另请参阅 http://www.thedelphigeek.com/2011/01/parallel-for-implementation-1-overview.html。
应该是这样的
Parallel.ForEach(0, 10 (* ,1 *) )
.NumTasks( 4 )
.Execute(
procedure (const elem: integer)
begin
WriteLn( elem );
end
);
这个问题比你想的更有意义。首先 Tparallel 被设计为仅适用于特定情况。例如
这对 tparallel 很有帮助
TParallel.For(1, Max, procedure (I: Integer)
begin
Do_processor_intensive_work
end);
这一定要避免:
TParallel.For(1, Max, procedure (I: Integer)
begin
do_waiting_proc_like_downloading_url
end);
为什么?这就是我回答您的问题的地方:这是因为 Tparallel 创建的线程数与系统上可用的处理器(虚拟或物理)数量相匹配。因此,如果您有 32 个处理器,那么它最多会创建 32 个线程,如果您只有 1 个处理器,那么它只会创建一个线程。这对所有应用程序也是全局的,如果您有 2 个线程,每个线程执行 Tparalell,则处理器不会有超过一个线程
所以 Tparallel 的想法是你不需要担心线程的数量,系统会为你选择最优化的数量。但是正如您在我的示例中看到的那样,如果您的 tparallel 不是处理器密集型,那么您可能需要比可用处理器数量更多的线程,在这种情况下我强烈建议避免使用 tparallel 并改用 TanonymousThread
你可以通过执行 SetMaxWorkerThreads 来覆盖这个数字(默认情况下是处理器的数量)但是如果你需要这样做他们很幸运你必须完全避免使用 Tparallel 并且需要使用 TanonymousThread
在C#中,可以限制线程数,像这样:
Parallel.For(0, 10, new ParallelOptions { MaxDegreeOfParallelism = 4 }, count =>
{
Console.WriteLine(count);
});
Delphi 是否在最新的编译器中有这个,例如柏林。或者 omnithreadlibrary 有这个吗?
使用Parallel.For
overload that accepts a TThreadPool
, and supply a thread pool that limits the number of threads. That is done with the SetMaxWorkerThreads
方法。
请注意,我是通过阅读 documentation 获得此信息的。
Or does the omnithreadlibrary have this?
它也有。
如果您从 Parallel.For
构造函数开始,那么您将获得具有 .NumTasks
方法的 IOmniParallelSimpleLoop
接口,默认为 CPU 核心数。如果您使用 .NoWait
调用将循环与当前执行线程分离,它可能会被调整。
无论您从 Parallel.ForEach
生成器开始,您都会获得 IOmniParallelLoop
接口并且它也有 NumTasks
。
参见 http://otl.17slon.com/book/chap04.html#highlevel-for
中的第 2.12.4 和 2.11.1 章有关预期调用语法的一般概念,另请参阅 http://www.thedelphigeek.com/2011/01/parallel-for-implementation-1-overview.html。
应该是这样的
Parallel.ForEach(0, 10 (* ,1 *) )
.NumTasks( 4 )
.Execute(
procedure (const elem: integer)
begin
WriteLn( elem );
end
);
这个问题比你想的更有意义。首先 Tparallel 被设计为仅适用于特定情况。例如
这对 tparallel 很有帮助
TParallel.For(1, Max, procedure (I: Integer)
begin
Do_processor_intensive_work
end);
这一定要避免:
TParallel.For(1, Max, procedure (I: Integer)
begin
do_waiting_proc_like_downloading_url
end);
为什么?这就是我回答您的问题的地方:这是因为 Tparallel 创建的线程数与系统上可用的处理器(虚拟或物理)数量相匹配。因此,如果您有 32 个处理器,那么它最多会创建 32 个线程,如果您只有 1 个处理器,那么它只会创建一个线程。这对所有应用程序也是全局的,如果您有 2 个线程,每个线程执行 Tparalell,则处理器不会有超过一个线程
所以 Tparallel 的想法是你不需要担心线程的数量,系统会为你选择最优化的数量。但是正如您在我的示例中看到的那样,如果您的 tparallel 不是处理器密集型,那么您可能需要比可用处理器数量更多的线程,在这种情况下我强烈建议避免使用 tparallel 并改用 TanonymousThread
你可以通过执行 SetMaxWorkerThreads 来覆盖这个数字(默认情况下是处理器的数量)但是如果你需要这样做他们很幸运你必须完全避免使用 Tparallel 并且需要使用 TanonymousThread