我不明白异步操作如何使HTTP服务器并发

时间:2017-06-21 15:10:07

标签: c++ asynchronous boost-asio

我正在使用boost asio开发HTTP服务器。到目前为止,我一直在使用异步操作(aync_readasync_write等),但我想让我的服务器并发,也就是说,每个新服务器都创建一个新线程客户连接。

我已经阅读了一些论坛等,显然,只能通过使用上面提到的异步操作来创建并发服务器。 我不明白这是怎么回事。

我的意思是,考虑到异步操作'处理程序在调用io_service.run()的线程中执行,让我们知道此时客户端正在响应。当主线程忙于第一个客户端时,另一个客户如何进行请求并得到应答?

3 个答案:

答案 0 :(得分:4)

单词"并发"的含义很暧昧。

你是对的,异步服务器根本不是并发的。它一次只能处理一个请求。但关键的见解是,大多数服务器所做的实际上是他们接受请求,进行一些轻量级处理(解析,序列化,验证,一些轻型业务逻辑等),然后调用外部资源(例如某些数据库)。然后,服务器可以在等待外部资源的同时处理其他请求。所以它只是一种并发的错觉(处理一个接一个地发生,但真的很快)。只要与io相比处理速度相对较快,它就能正常工作。

如果您的服务器应该进行一些硬cpu计算,那么显然根本就没有并发性。在这种情况下,使其并发的唯一方法是添加线程或进程(可能在多台机器上)。

答案 1 :(得分:1)

异步IO不会使服务器并发。

实际上,异步IO并不意味着"多线程"或"多处理"一点都不Node.js服务器是单线程的,并使用异步IO。

异步IO只是意味着你的线程不会等待IO完成,而是同时做其他事情(比如接受和处理新的传入请求)。

所以不,Asynchronous IO使服务器并发的前提是错误的。它不会使它并发,它使可伸缩,因为每个请求的线程不是那么可伸缩,但是正确的线程池+事件队列/协同程序是。线程只处理CPU绑定任务,事件队列/协同程序管理入队和出队启动/完成的IO操作。

答案 2 :(得分:0)

不确定您是仅仅寻找理论答案还是设计示例,但是您是否看过boost.asio的HTTP Server 3示例?

通过使用一个小线程池来执行工作来实现并发。当需要处理回调时,可以选择调用io_service.run()的所有线程来执行任务。