用于事件驱动作业的 C++ 多线程或多处理服务器

Posted

技术标签:

【中文标题】用于事件驱动作业的 C++ 多线程或多处理服务器【英文标题】:C++ Multi threaded or multi processed server for event driven jobs 【发布时间】:2021-09-21 18:03:39 【问题描述】:

我用 C++ 开发了一个大型应用程序,它执行工作,它接收输入 x 并输出 y。对于此应用程序,速度是重中之重。该应用程序能够同时运行。我想修改这个应用程序以实现一个 HTTP 服务器,以便它可以用作 一个 REST API,用户发送 x 并接收 y 作为其响应。 HTTP 服务器将通过生成一个新线程来运行作业,一个新进程来为请求提供服务。

我对多线程有些担心:

根据用户的输入,作业可以无限期挂起。因此,必须实施某种超时机制,如果超过时间限制,它将终止作业。如果作业要作为单独的进程运行,只需结束进程即可轻松完成。

但是,如果作业在线程上运行,我将不得不修改实际应用程序以配合超时代码,并保证程序能够恢复所有内存在任何给定时间,这将是很多工作(因为代码库很大并且经过优化)并且还可能对性能产生影响(例如,不断检查是否超过了时间限制)。

我听说在 Windows 上生成进程很慢,所以我想在启动服务器时生成 n 个工作进程,然后从服务器发送输入信息给一个空闲的工人并发回输出。 (这种预产卵过程的做法是一回事吗?)

当涉及到多处理时,我关心的是进程之间的通信,一旦完成,就必须将输出信息发送到它的生成器。此外,我听说多线程的性能优于多处理 (Windows)。

老实说,我对我应该走哪条路线感到有些困惑,并且想知道是否有人对执行请求驱动型作业的服务器应用程序应该如何以最佳方式工作有任何建议或见解。

【问题讨论】:

有点不清楚您正在考虑哪些选项以及您认为每个选项的问题或缺点。多线程 + 结束线程/工作线程的机制听起来很合理,具体取决于您使用的服务器端语言。 @Evert 我已根据您的反馈更新了问题。该应用程序使用 C++。您是否建议工作人员应该在自己的线程上而不是在自己的进程上运行?如果是这样,你有什么理由吗? 本来有很多编程语言我可以提供具体建议,但 C++ 不是其中之一。 【参考方案1】:

解决此问题的最佳方法需要了解“工作如何无限期挂起”的知识。

你必须在某个地方处理这个逻辑,如果我是你,我宁愿把所有东西都保存在 C++ 中。一般来说,如果有人开始在他们的代码库中对底层系统进行大量调用,我会认为这是一种代码异味。这些类型的事情通常会导致安全问题。

此外,我更愿意将所有内容都包含在 C++ 中,因为它会使代码更易于移植到不同的操作系统。如果您开始尝试管理操作系统的进程,那么突然之间,您的代码库就会与特定的操作系统(在本例中为 Windows)相关联。现在,如果您尝试将其部署到云端,则需要一台 Windows 服务器。

【讨论】:

以上是关于用于事件驱动作业的 C++ 多线程或多处理服务器的主要内容,如果未能解决你的问题,请参考以下文章

QT 信号槽 异步事件驱动 单线程 多并发

freeradius 性能优化

Node学习笔记:事件驱动

学习react一个多月来的总结

libevent学习

C++多线程同步技巧--- 事件