1

我编写了一个简单的程序来定期检查数据。问题是检查过程会随着时间的推移而减慢。首先它在一秒钟内发送 2 个帖子,大约 45 秒后它发送一个帖子,最终完全停止。我不知道这里有什么问题。

procedure TForm2.CheckURLs;
var
  lHTTP: TIdHTTP;
  IdSSL : TIdSSLIOHandlerSocketOpenSSL;
  N: Integer;
  Access: string;
  Params, Reply: TStringList;
  Cookie: TIdCookie;
begin
  lHTTP := TIdHTTP.Create(nil);
  try
    IdSSL := TIdSSLIOHandlerSocketOpenSSL.Create(lHTTP);
    IdSSL.SSLOptions.Method := sslvTLSv1;
    IdSSL.SSLOptions.Mode := sslmClient;
    lHTTP.IOHandler := IdSSL;
    lHTTP.ReadTimeout := 30000;
    lHTTP.HandleRedirects := True;
    lHTTP.Request.UserAgent := 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36';
    lHTTP.Get('https://www.mywebserver.com', TStream(nil));
    Cookie := lHTTP.CookieManager.CookieCollection.Cookie['id', 'www.mywebserver.com'];
    if Cookie <> nil then
      Access := Cookie.Value;
  finally
  end;

  Params := TStringList.Create;
  Reply  := TStringList.Create;

  TTask.Create(
    procedure
    var
      N, m, i : integer;
    begin
      Params.Add('IDs=' +B.Strings[i]);
      try
        lHTTP.Request.CustomHeaders.Values['id'] := Access;
        lHTTP.Request.CustomHeaders.Values['X-Requested-With'] := 'XMLHttpRequest';
        lHTTP.Request.Referer := 'https://www.mywebserver.com/';
        lHTTP.Request.ContentType := 'application/x-www-form-urlencoded';
        lHTTP.Request.UserAgent := 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36';
        lHTTP.ConnectTimeout := 0;
        Reply.Text := lHTTP.Post('https://www.mywebserver.com/', Params);

        if AnsiContainsStr(Reply.Text, 'nothing') then
        begin
          TThread.Synchronize(nil,
            procedure
            begin
              Memo1.Lines.Add(B.Strings[i]);
              Label2.Caption := Memo1.Lines.Count.ToString;
            end
          );
        end;        
      finally
        Reply.Clear;
      end;
    end
  ).Start;
end;
4

2 回答 2

2

除了 technicolor 所说的,TTask在 Delphi 10.1 Berlin 中还存在已知的时序问题,例如:

RSP-15233:TTask 卡住并且需要很长时间才能启动

RSP-12557:TTask 在没有明显原因的情况下序列化并行任务

要避免这些问题,请尝试使用TThread.CreateAnonymousThread()而不是TTask.

于 2016-07-31T19:34:17.893 回答
0

您的缓慢可能来自程序的这两个部分:下载数据或处理它们。

根据经验,我怀疑该网站会减慢您的速度,因此您可以在下载过程后尝试注释掉所有内容(当然要小心)。再次运行这个程序应该得到相同的结果,然后在网站上给我们确认“故障”。

为避免由于反机器人保护而被阻止 45 秒,请尝试通过在每次请求后添加几秒钟的暂停来预防性地减慢您的程序。即使没有保护,让我们的网络机器人慢一点也是一个好习惯。我们不做 DoS :)

于 2016-07-31T13:57:44.063 回答