sako
sako
> > 我觉得reactor模式代码有问题。代码中将读事件插入阻塞队列中后有一个while(true)循环一直等到线程从阻塞队列中取此http链接后接受数据后才break。相当于阻塞队列中永远至多有一个http连接。 > > 请教老哥觉得怎么修改才合理,能不能直接删掉这个while呢 我直接删掉了,结果网页可以正常运行,但是webbench压测的Requests一直为0,pages/min也为0,但是bytes/sec正常,不知道什么原因
> 找到原因了,注释掉读事件的循环之后工作线程会吧improv置为1,但是主线程的循环被注释后会导致iimprov绝大部分事件为0,之后在读事件之后才能为1。这就导致写事件很可能在工作线程没有写完之前就跳出循环了,没有结束连接,又因为webbench的模拟的请求都是短连接,在写事件完成应该关闭连接才能够算是一次事件,这样就造成压测的结果异常。
想要解决这个问题,应该把主线程判断工作线程io操作的这个逻辑让工作线程自己完成。
> > 我觉得reactor模式代码有问题。代码中将读事件插入阻塞队列中后有一个while(true)循环一直等到线程从阻塞队列中取此http链接后接受数据后才break。相当于阻塞队列中永远至多有一个http连接。 > > 请教老哥觉得怎么修改才合理,能不能直接删掉这个while呢 我觉得修改的话需要把原本主线程执行的逻辑挪到线程池模块,比如关闭连接和删除定时器。但是这里的Webserver类是包含线程池的头文件的,如果threadpool中的工作线程需要调这个定时器删除逻辑的话,应该引入Webserver的头文件,然后把Webserver对象传入。但是这样会造成头文件循环依赖相互包含,我想的是把Webserver类维护定时器的职能拆分出来独立为一个模块,然后Webserver和threadpool同时包含他的实例化对象,让工作线程读完之后自己判断是否删除定时器以及关闭连接。主线程只负责监听事件即可。
我觉得这个reacotor之所以这样写很大可能是因为作者偷懒了,先写的模拟proactor。在这个框架上写reactor,所以职能区分的有些问题,但是可以省很多功夫。因为模块之间耦合的比较严重,修改的话不符合开放封闭原则,容易牵一发动全身。
> > > > 我觉得reactor模式代码有问题。代码中将读事件插入阻塞队列中后有一个while(true)循环一直等到线程从阻塞队列中取此http链接后接受数据后才break。相当于阻塞队列中永远至多有一个http连接。 > > > > > > > > > 请教老哥觉得怎么修改才合理,能不能直接删掉这个while呢 > > > 我觉得修改的话需要把原本主线程执行的逻辑挪到线程池模块,比如关闭连接和删除定时器。但是这里的Webserver类是包含线程池的头文件的,如果threadpool中的工作线程需要调这个定时器删除逻辑的话,应该引入Webserver的头文件,然后把Webserver对象传入。但是这样会造成头文件循环依赖相互包含,我想的是把Webserver类维护定时器的职能拆分出来独立为一个模块,然后Webserver和threadpool同时包含他的实例化对象,让工作线程读完之后自己判断是否删除定时器以及关闭连接。主线程只负责监听事件即可。 > > 我自己的项目[HAHA-WebServer](https://github.com/tomatowithpotato/HAHA-WebServer),是参考别人的做法,把evenloop单独抽出来,定时器部分直接交给eventloop,相关的删除操作则是由webserver对象对eventloop注册回调函数去完成,这样就不耦合了 已经star ^-^
我对项目做了修改,将webserver的部分职能移到了httpconn 模块。删除掉了Reactor模式的while循环阻塞,改为在子线程中结束连接,但是压测结果没有太大提升,可能是因为webbench的请求方式的原因,io的耗时太短。有兴趣的可以看看 https://github.com/huboy-zhao/MyWebserver