【发布时间】:2019-04-11 01:53:18
【问题描述】:
我有一个应用程序每天发出数千个 HTTP 请求。 为了获得最佳性能,我决定只创建一次 IdHTTP 对象,并对所有请求使用相同的对象。 这就是问题的开始。在为每个请求创建一个 IdHTTP 时,一切都很顺利。 代码非常基本:
constructor HTTPThread.Create;
begin
inherited Create(false);
httpObject:= TIdHTTP.Create(Nil);
sslObject:= TIdSSLIOHandlerSocketOpenSSL.Create(Nil);
sslObject.SSLOptions.Method:= sslvTLSv1_2;
httpObject.IOHandler:= sslObject;
httpObject.Request.Accept:= frmHTTPRequests.Edit1.Text;
httpObject.Request.UserAgent:= frmHTTPRequests.Edit3.Text;
httpObject.ReadTimeout:= 15000;
httpObject.HandleRedirects:= true;
FreeOnTerminate:= true;
OnTerminate:= TerminateProc;
end;
procedure HTTPThread.DoRequests;
var
htmlSource: string;
begin
try
htmlSource:= httpObject.Get(Link);
//a bunch of other stuff with HTML source
except
on E : Exception do
Synchronize(procedure
begin
errorList.Add(E.Message);
errorList.SaveToFile('Error.txt');
end);
end;
end;
我创建了这个,除了保存 Error.txt 文件来观察正在发生的事情...... 代码有时对于前 1k 请求运行良好,有时对于前 2k,它会有所不同。突然,它开始在 TXT 文件上写入相同的错误:
连接被对等方重置。 domain.com - 套接字错误 #10054
我尝试断开 httpObject,尝试了 httpObject.Request.Clear,但似乎没有任何效果。 有没有机会完成这项工作?
【问题讨论】:
-
我在使用 TIdHttp 时遇到过类似的问题,我的解决方案是重新创建组件以防出错并重试。只有当第二次尝试也失败时,它才会被认为是一个实际问题。
-
与执行实际请求相比,您是否实际测量过创建对象所需的时间和开销?我认为收益可以忽略不计,除非所有请求都发往同一台服务器,并且您可以利用保持活动连接的使用。
-
@GolezTrol 我没有检查...谢谢您的洞察力。
-
@HeartWare 好的...很高兴知道这是一个常见问题。
标签: multithreading delphi idhttp