我们一直在使用优秀的cpp-httlib来发出 REST 请求。现在我们想将它用作服务器。文档顶部的内容如下:
重要的
此库使用“阻塞”套接字 I/O。如果您正在寻找具有“非阻塞”套接字 I/O 的库,那么这不是您想要的。
我不确定这在实际意义上意味着什么,因为虽然我了解 IP/UDP/TCP 等的基本原理,但我不熟悉套接字编程。我通过向服务器发出多个请求来测试服务器,例如,如果第一个请求通过休眠 30 秒来实现,那么第二个“hello world”请求仍会立即返回。
调试代码,我看到主线程运行:
while (svr_sock_ != INVALID_SOCKET) {
// socket operations
if (!task_queue->enqueue(
[this, sock]() { process_and_close_socket(sock); })) {
detail::shutdown_socket(sock);
detail::close_socket(sock);
}
}
工作线程运行
for (;;) {
std::function<void()> fn;
{
// Lock / wait for new request
fn = pool_.jobs_.front();
pool_.jobs_.pop_front();
}
fn();
}
即主线程就像 GUI 应用程序中的事件循环,接收每个传入请求,但不是执行请求本身,而是将其放在队列中以供工作线程接收。
以前,我在 Python FastAPI Web 服务器中调用了 C++,这很好,但同时运行 Python 和 C++ 显然会增加开销/复杂性,而且很难理解请求是如何在全局解释器锁的情况下执行的。使用 cpp-httlib 的直接 C++ 方法看起来好多了,但关于“阻塞”套接字 I/O 的评论让我担心。不使用非阻塞套接字 I/O 会让我错过什么?
(该服务器将针对 Windows 和 Linux 进行构建;但产品将是 Linux。)