TParallel 在 Delphi 中的使用与 CPU 使用率问题

欢迎加入全网最大Delphi 技术交流群 682628230

 

TParallel 是 Delphi 中用于并行处理的一个强大工具,它允许开发者轻松地将串行任务转换为并行任务,从而充分利用多核 CPU 的性能。然而,在使用 TParallel 时,可能会遇到一些性能问题,尤其是在 Delphi 12 及更高版本中,可能会出现 CPU 使用率异常高的情况。

问题描述

在 Delphi 12 中,使用 TParallel.For 进行并行循环后,CPU 使用率可能会持续保持在高位,即使循环已经结束。这个问题通常与线程池的管理有关,尤其是在嵌套并行循环的情况下。

解决方案

  1. 1. 禁用无限工作线程
    可以通过设置 TThreadPool.Default.UnlimitedWorkerThreadsWhenBlocked 为 False 来恢复到旧的行为模式。这样可以防止线程池在遇到阻塞时无限创建新的工作线程。
    TThreadPool.Default.UnlimitedWorkerThreadsWhenBlocked := False;

    注意:禁用此选项后,应避免使用嵌套的并行循环,否则可能会导致死锁。

  2. 2. 使用自定义线程池
    如果需要在特定情况下使用嵌套并行循环,可以创建并使用自定义的线程池。这样可以在任务完成后释放线程池,从而避免 CPU 使用率过高的问题。
    procedure TForm1.Button2Click(Sender: TObject);
    var
      Pool: TThreadPool;
    begin
      Pool := TThreadPool.Create;
      try
        TParallel.&For(1100000,
          procedure(I: Integer)
          var
            lList:
     TStringList;
          begin
            lList := TStringList.Create;
            try
              lList.Add(i.ToString);
            finally
              lList.Free;
            end;
          end, Pool);
      finally
        Pool.Free;
      end;
    end;
  3. 3. 简化代码
    TParallel.For 是一个类函数,不需要创建 TParallel 的实例。可以直接调用它来简化代码。
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      TParallel.&For(1100000,
        procedure(I: Integer)
        var
          lList:
     TStringList;
        begin
          lList := TStringList.Create;
          try
            lList.Add(i.ToString);
          finally
            lList.Free;
          end;
        end);
    end;

 

TParallel 是 Delphi 中处理并行任务的强大工具,但在使用过程中可能会遇到 CPU 使用率过高的问题。通过禁用无限工作线程或使用自定义线程池,可以有效解决这一问题。同时,简化代码结构也能提高代码的可读性和维护性。

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享