Amu*_*umu 11 c++ webserver multithreading boost-asio
在同步模型中,当客户端连接到服务器时,客户端和服务器都必须彼此同步才能完成某些操作.
同时,异步模型允许客户端和服务器分离和独立地工作.客户端发送建立连接的请求并执行某些操作.当服务器正在处理请求时,客户端可以执行其他操作.完成操作后,将完成事件放置在事件解复用器中的队列中,等待Proactor(例如HTTP处理程序)发回请求并调用完成处理程序(在客户端上).这些术语在boost :: asio文档中使用.Proactor设计模式:没有线程的并发.
通过这种方式,异步模型可以接受同时连接,而无需为每个连接创建一个线程,从而提高整体性能.为了实现与异步模型相同的效果,第一个模型(同步)必须是多线程的.有关更多详细信息,请参阅:Proactor Pattern(我实际上学习了用于该文档的异步模型的proactor模式.在这里它描述了典型的同步I/O Web服务器).
我对这个问题的理解是否正确?如果是这样,这意味着异步服务器可以接受请求并异步返回结果(第一个连接请求Web服务器上的服务不需要是第一个回复的)?本质上,异步模型不使用线程(或者在单个组件中使用线程,例如在Proactor,异步事件多路复用器(boost :: asio文档)组件中,而不是通过创建整个客户端 - 服务器应用程序堆栈,这是描述在Proactor Pattern文档的多线程模型中,第2.2节 - 常规并发模型的常见陷阱和陷阱).
aby*_*s.7 14
Proactor模型假设在以下子任务中拆分网络会话过程:解析主机名,接受或连接,读取或写入信息的某些部分,关闭连接 - 并允许您在不同会话的子任务之间切换.然而,Reactor模型将网络会话过程视为(几乎)单个任务.
绝对的Proactor优势:
绝对的Proactor缺点:
但总体表现通常是在每个时间段的许多"满意"客户中测量的.因此,Proactor与Reactor的优势取决于具体情况.这里举一些例子.
HTTP服务器.客户希望在浏览器窗口中看到某些内容.他不需要在加载整个页面之前等待以查看第一段文本.Proactor是有效的,因为部分页面加载比整个页面加载更快.整个页面的加载时间与Reactor模型大致相同.
低延迟游戏服务器.客户希望尽快得到他命令的完整结果.Reactor是有效的,因为没有像部分阅读或写作这样的子任务 - 客户端在读取完整响应之前不会看到任何内容.因此,Reactor不会在子任务之间进行额外的切换,并且每次都保证某个客户端在他的命令上获得进展,而Proactor将强制所有客户端彼此等待不可预测的时间.
多线程可以在两种情况下为您提供线性加速.