有没有办法在TThreadpool检测到低CPU后添加新任务时加快延迟?
例如,我将MaxWorkerThreads设置为100,然后将MinWorkerThreads设置为1,然后在循环中创建100个任务:
for j:=0 to tthreadpool.Default.MaxWorkerThreads-1 do
begin
task:=TTask.Run(procedure
var
x,i:integer;
begin
while ttask.CurrentTask.Status<>ttaskstatus.Canceled do
begin
for i:=0 to 10000 do x:=round(sin(i));
sleep(1);
end;
end);
end;
请注意,上面的代码只是一个示例,其中包含一些无意义的代码,因此任务可以执行。
CPU始终低于5,并且仍需要TThreadPool 1秒钟来添加新任务,这意味着,最终需要100个任务才能运行。
这是因为它在决定添加新任务之前每秒检查CPU使用率是多少吗?
有没有办法在不将MinWorkerThreads设置为100的情况下加快速度,或者是否设计并且我需要使用TThread?
答案 0 :(得分:0)
对于阅读这篇文章的其他人,我刚刚记录了质量控制的错误。看起来像TThreadPool(至少在最新的Delphi 10.2.3中)实际上从未超过MINIMUM工作者数量,这可能是你的代码没有做到应有的原因。线程池上的SetMinWorkerThreads / SetMaxWorkerThreads值也存在问题。如果将max设置为4,并且在将max调整为10之前尝试将min设置为8,则不会设置最小值。这两个问题都是巨大的问题。
按如下方式手动调整System.threading.pas并添加到您的项目中......
function TThreadPool.ShouldGrowPool: Boolean;
begin
Result := {(FWorkerThreadCount < FMinLimitWorkerThreadCount) and }(FIdleWorkerThreadCount < FQueuedRequestCount) and
(FWorkerThreadCount < Self.FMaxLimitWorkerThreadCount);
end;