Delphi Parallel.For是否具有MaxParallism

时间:2017-02-01 10:37:50

标签: delphi delphi-10.1-berlin omnithreadlibrary

在C#中,您可以限制线程数,如下所示:

MyPOJO pojo = new MyPOJO();
pojo.fooType = Foo.class;

ObjectMapper om = new ObjectMapper();
String json = om.writeValueAsString(pojo);

Delphi是否在最新的编译器中具有此功能,例如柏林。或者omnithreadlibrary有这个吗?

3 个答案:

答案 0 :(得分:3)

使用接受Parallel.For overloadTThreadPool,并提供限制线程数的线程池。这是通过SetMaxWorkerThreads方法完成的。

请注意,我通过阅读documentation获取了此信息。

答案 1 :(得分:1)

  

或者omnithreadlibrary有这个吗?

确实也有。

如果您从Parallel.For构造函数开始,那么您将获得具有IOmniParallelSimpleLoop方法的.NumTasks接口,默认为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
  );

答案 2 :(得分:0)

这个问题有你想的更多含义。第一个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