Delphi Indy TIdHTTP.Get()高CPU负载

时间:2018-06-22 22:39:13

标签: http delphi indy

我在这里看到了类似的问题,但没有有用的答案,所以让我再写一次。

我的应用程序使用了太多的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%

enter image description here

更新:回答以下评论:100个运行sleep(5)的线程周期不加载CPU

通过设置StartWork:=true启动阅读器后,我看到16核Ryzen的CPU负载为10%。在1核VDS上运行时,这变成了一个非常痛苦的问题。

问题是:实际上要使用那么多CPU的简单操作应该如何等待?如何“优化”呢?

image

UPDATE2:

很难解释这个问题与sleep(5)无关,所以还有2张图片:

我已将sleep(5)替换为sleep(100 + random(100))

enter image description here

来自2核vds的图片:

enter image description here

0 个答案:

没有答案