TIdHTTP 线程安全吗?

问题描述

我在班级中使用 TIdHTTP 来处理 Web API (TWebAPI)。由于可能会在 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 可以由 TCriticalSectionTMonitor 保护。不涉及 R/W,所以不要使用 TMultiReadExclusiveWriteSynchronizer - 只是一个互斥锁/锁。但是如果您使用单个 TIdHTTP,您将需要一个互斥锁/锁,因此所有 HTTP 调用都将被序列化,这在多线程服务器上可能不是一个好主意。

我会为每个线程维护一个连接,或者编写一个连接池。也许每次只是一个给定的 TIdHTTP 可能不会太糟糕。至少它是安全的,以后会有改进的空间。重新打开 TCP/HTTP 连接在实践中很快。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...