我在这里看到了类似的问题,但没有有用的答案,所以让我再写一次。
我的应用程序使用了太多的CPU,作为一个测试示例,我从前10个最慢的站点中选择了一个慢站点(https://www.hao123.com/),并同时读取100个线程。
没有响应处理;一个请求大约需要5秒钟,因此对我来说,我的线程应该几乎所有时间都在等待响应,因此我的线程应该使用大约0%的CPU。
procedure mth.Execute;
var
tm1: dword;
begin
HTTP:=TIdHTTP.Create;
HTTP.ConnectTimeout:=60000;
HTTP.ReadTimeout:=60000;
ssl:=TIdSSLIOHandlerSocketOpenSSL.Create;
HTTP.IOHandler:=ssl;
HTTP.HandleRedirects:=true;
HTTP.ProtocolVersion:=pv1_1;
repeat
sleep(5);
If StartWork then begin
tm1:=TimeGetTime;
s:=HTTP.Get('https://www.hao123.com/');
GlobalTiming:=(GlobalTiming * 9 + (TimeGetTime-tm1)) / 10;
end;
until Terminated;
HTTP.Free;
ssl.Free;
end;
测试应用程序开始使用StartWork=false
创建线程。只要不设置StartWork:=true
,CPU负载约为0%
更新:回答以下评论:100个运行sleep(5)
的线程周期不加载CPU
通过设置StartWork:=true
启动阅读器后,我看到16核Ryzen的CPU负载为10%。在1核VDS上运行时,这变成了一个非常痛苦的问题。
问题是:实际上要使用那么多CPU的简单操作应该如何等待?如何“优化”呢?
UPDATE2:
很难解释这个问题与sleep(5)
无关,所以还有2张图片:
我已将sleep(5)
替换为sleep(100 + random(100))
来自2核vds的图片: