Delphi并行吗?例如,有MaxParallism吗
在C#中,可以限制线程数,如下所示:Delphi并行吗?例如,有MaxParallism吗,delphi,delphi-10.1-berlin,omnithreadlibrary,Delphi,Delphi 10.1 Berlin,Omnithreadlibrary,在C#中,可以限制线程数,如下所示: Parallel.For(0, 10, new ParallelOptions { MaxDegreeOfParallelism = 4 }, count => { Console.WriteLine(count); }); Delphi是否在最新的编译器(如柏林)中有此功能。或者omnithreadlibrary具有此功能?使用接受的,并提供限制线程数量的线程池。这是通过该方法完成的 请注意,我是通过阅读 或者omnithreadlibra
Parallel.For(0, 10, new ParallelOptions { MaxDegreeOfParallelism = 4 }, count =>
{
Console.WriteLine(count);
});
Delphi是否在最新的编译器(如柏林)中有此功能。或者omnithreadlibrary具有此功能?使用接受的,并提供限制线程数量的线程池。这是通过该方法完成的
请注意,我是通过阅读
或者omnithreadlibrary有这个
它也有
如果您从Parallel.For
构造函数开始,那么您将获得iomnipallelosimpleloop
接口,该接口具有.NumTasks
方法,默认为CPU核心计数。如果使用.NoWait
调用从当前执行线程分离循环,则可能会对其进行调整
无论您是从Parallel.ForEach
生成器开始,您都会获得IOMNIAllelLoop
接口,并且它也有numtask
见第2.12.4章和第2.11.1章
有关预期调用语法的一般概念,请参见
应该是这样的
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个处理器,那么它将只创建一个线程。这对所有应用程序来说也是全局的,如果你有两个线程,每个线程都做Tparalell,那么每个处理器不会有多个线程
因此,Tparallel的理念是,您不需要担心线程的数量,系统会为您选择最佳的线程数量。但正如您在我的示例中看到的,如果您的tparallel不是处理器密集型的,那么您可能需要比可用处理器数量更多的线程,在这种情况下,我强烈建议避免tparallel,而使用TanonymousThread
您可以通过执行SetMaxWorkerThreads(默认情况下是处理器的数量)来覆盖此数字,但如果需要执行此操作,您必须避免使用Tparallel,而需要使用TanonymousThread