TParallel 是 Delphi 中用于并行处理的一个强大工具,它允许开发者轻松地将串行任务转换为并行任务,从而充分利用多核 CPU 的性能。然而,在使用 TParallel 时,可能会遇到一些性能问题,尤其是在 Delphi 12 及更高版本中,可能会出现 CPU 使用率异常高的情况。
问题描述
在 Delphi 12 中,使用 TParallel.For 进行并行循环后,CPU 使用率可能会持续保持在高位,即使循环已经结束。这个问题通常与线程池的管理有关,尤其是在嵌套并行循环的情况下。
解决方案
- 1. 禁用无限工作线程
可以通过设置TThreadPool.Default.UnlimitedWorkerThreadsWhenBlocked
为False
来恢复到旧的行为模式。这样可以防止线程池在遇到阻塞时无限创建新的工作线程。TThreadPool.Default.UnlimitedWorkerThreadsWhenBlocked := False;
注意:禁用此选项后,应避免使用嵌套的并行循环,否则可能会导致死锁。
- 2. 使用自定义线程池
如果需要在特定情况下使用嵌套并行循环,可以创建并使用自定义的线程池。这样可以在任务完成后释放线程池,从而避免 CPU 使用率过高的问题。procedure TForm1.Button2Click(Sender: TObject);
var
Pool: TThreadPool;
begin
Pool := TThreadPool.Create;
try
TParallel.&For(1, 100000,
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. 简化代码
TParallel.For 是一个类函数,不需要创建 TParallel 的实例。可以直接调用它来简化代码。procedure TForm1.Button2Click(Sender: TObject);
begin
TParallel.&For(1, 100000,
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