【发布时间】:2014-06-29 13:28:47
【问题描述】:
我需要编写一个多线程 HTTP 服务器。我知道 Indy 通过 IdThreadMgrPool 处理线程。
我的要求很简单:有一个服务器可以同时接受多个客户端(Web 浏览器 POST 请求),运行有限数量的调用 Delphi DLL 的线程(可能独立于连接线程),并返回结果。
非阻塞将是终极的(如 node.js)。
关于这个主题有几个 SO 帖子。我在这里(或通过 Google)找不到的是如何使用 IdThreadMgrPool 的示例。我看到帖子说必须使用它,但没有示例如何使用。 Indy 的网站上也没有示例。
有人能给我举个例子吗?或者是否有适用于此的 FOS 框架?
一个想法是让 Indy 正常生成多个线程,然后让这些线程访问运行 DLL 的受控线程池。如果这是合理的,那么我只需要知道“正常”案例用法示例。
【问题讨论】:
-
每个 HTTP 请求都会根据需要自动生成新线程。我认为您根本不需要线程池,我从来没有使用过。
-
那我该如何控制被调用的DLL实例的数量呢?如果我说的是双 CPU 服务器,我希望初始化 2 个 DLL 实例并等待客户端。我不想每次都启动 DLL 并杀死它(它是一个处理引擎并且有开销)。
-
这使得它非常棘手。您不应该对每个请求都执行此操作,因为假设服务器同时接收 10 个请求。它可能需要自动生成多达 10 个线程来同时处理所有线程。您不想将 Indy 限制为仅生成 2 个线程,否则它将无法按预期同时工作。在接收任何请求之前,您需要通过其他方式控制此 DLL。
-
当已经有许多非常好的 HTTP 服务器可以为您处理这些问题时,您是否有某些原因要编写自己的服务器?特别是,如果您在 Windows 上,如果您编写 Delphi ISAPI dll,IIS 7.5 将使您对所询问的内容进行精细控制。
-
听取@Vector 的好建议。让 IIS 处理服务,并根据需要调用尽可能多的 DLL 实例。我有一个可以全天处理每秒 40 个请求的请求。我不担心线程、印地等。
标签: web-services delphi webserver indy httpserver