TIdHTTP 线程安全吗?
Is TIdHTTP threadsafe?
我在 class 中使用 TIdHTTP
来处理网络 API (TWebAPI
)。因为这个 class 可能会用在 TIdHTTPServer.OnCommandGet
事件处理程序中,所以我需要确保 TWebAPI
是线程安全的。
我需要将 PUT
/GET
/POST
包裹在 TMultiReadExclusiveWriteSynchronizer
中吗?
编辑:代码示例
TWebAPI
TWebAPI=class(TObject)
FSocket:TidHTTP;
end;
procedure TWebAPI.Send;
Var
Response:TSTringStream;
begin
FSocket.Get(fURL,Response);
end;
主程序
TMain=class(TForm)
Server:TidHTTPServer;
WebAPI:TWebAPI;
end;
procedure TMain.ServerCommandGet(....)
begin
WebAPI.Send;
end;
所以我的 WebAPI 将在服务器获取的每个命令的不同线程中使用。我应该在 TMain 中使用 CriticalSection,还是像这样在 TWebAPI 中实现它?
TWebAPI=class(TObject)
FSocket:TidHTTP;
FLock:TCriticalSection;
end;
procedure TWebAPI.Send;
Var
Response:TSTringStream;
begin
FLock.Aquire;
try
FSocket.Get(fURL,Response);
finally
FLock.Release;
end;
end;
单个 TIdHTTP 可以由 TCriticalSection
或 TMonitor
保护。没有涉及 R/W,所以不要使用 TMultiReadExclusiveWriteSynchronizer
- 只是一个 mutex/lock。但是,如果您使用单个 TIdHTTP,则需要 mutex/lock,因此所有 HTTP 调用都将被序列化,这在多线程服务器上可能不是一个好主意。
我会为每个线程维护一个连接,或者写一个连接池。也许每次只是一个给定的 TIdHTTP 可能还不错。至少它会安全,并且以后会有改进的空间。重新打开 TCP/HTTP 连接实际上很快。
我在 class 中使用 TIdHTTP
来处理网络 API (TWebAPI
)。因为这个 class 可能会用在 TIdHTTPServer.OnCommandGet
事件处理程序中,所以我需要确保 TWebAPI
是线程安全的。
我需要将 PUT
/GET
/POST
包裹在 TMultiReadExclusiveWriteSynchronizer
中吗?
编辑:代码示例
TWebAPI
TWebAPI=class(TObject)
FSocket:TidHTTP;
end;
procedure TWebAPI.Send;
Var
Response:TSTringStream;
begin
FSocket.Get(fURL,Response);
end;
主程序
TMain=class(TForm)
Server:TidHTTPServer;
WebAPI:TWebAPI;
end;
procedure TMain.ServerCommandGet(....)
begin
WebAPI.Send;
end;
所以我的 WebAPI 将在服务器获取的每个命令的不同线程中使用。我应该在 TMain 中使用 CriticalSection,还是像这样在 TWebAPI 中实现它?
TWebAPI=class(TObject)
FSocket:TidHTTP;
FLock:TCriticalSection;
end;
procedure TWebAPI.Send;
Var
Response:TSTringStream;
begin
FLock.Aquire;
try
FSocket.Get(fURL,Response);
finally
FLock.Release;
end;
end;
单个 TIdHTTP 可以由 TCriticalSection
或 TMonitor
保护。没有涉及 R/W,所以不要使用 TMultiReadExclusiveWriteSynchronizer
- 只是一个 mutex/lock。但是,如果您使用单个 TIdHTTP,则需要 mutex/lock,因此所有 HTTP 调用都将被序列化,这在多线程服务器上可能不是一个好主意。
我会为每个线程维护一个连接,或者写一个连接池。也许每次只是一个给定的 TIdHTTP 可能还不错。至少它会安全,并且以后会有改进的空间。重新打开 TCP/HTTP 连接实际上很快。