tomatowithpotato

Results 31 comments of tomatowithpotato

> 我觉得reactor模式代码有问题。代码中将读事件插入阻塞队列中后有一个while(true)循环一直等到线程从阻塞队列中取此http链接后接受数据后才break。相当于阻塞队列中永远至多有一个http连接。 请教老哥觉得怎么修改才合理,能不能直接删掉这个while呢

> 真心提问:为什么理论上说模拟的proactor会比reactor慢呢,模拟proactor中主线程是异步线程,按理说应该至少不会比多个reactor并行慢呀。 等个大佬解释一下。 本人也不大懂,我的理解是因为proactor里IO任务都交给主线程串行执行,而IO任务一般是非常慢的,这样的话新的连接到来了也没法被及时处理

> > > > 找到原因了,注释掉读事件的循环之后工作线程会吧improv置为1,但是主线程的循环被注释后会导致iimprov绝大部分事件为0,之后在读事件之后才能为1。这就导致写事件很可能在工作线程没有写完之前就跳出循环了,没有结束连接,又因为webbench的模拟的请求都是短连接,在写事件完成应该关闭连接才能够算是一次事件,这样就造成压测的结果异常。 good work!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

> > > 我觉得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注册回调函数去完成,这样就不耦合了

> 我觉得这个reacotor之所以这样写很大可能是因为作者偷懒了,先写的模拟proactor。在这个框架上写reactor,所以职能区分的有些问题,但是可以省很多功夫。因为模块之间耦合的比较严重,修改的话不符合开放封闭原则,容易牵一发动全身。 确实,作者应该也是知道这些问题,可能单纯不想改把

> > > > > 我觉得reactor模式代码有问题。代码中将读事件插入阻塞队列中后有一个while(true)循环一直等到线程从阻塞队列中取此http链接后接受数据后才break。相当于阻塞队列中永远至多有一个http连接。 > > > > > > > > > > > > 请教老哥觉得怎么修改才合理,能不能直接删掉这个while呢 > > > > 我觉得修改的话需要把原本主线程执行的逻辑挪到线程池模块,比如关闭连接和删除定时器。但是这里的Webserver类是包含线程池的头文件的,如果threadpool中的工作线程需要调这个定时器删除逻辑的话,应该引入Webserver的头文件,然后把Webserver对象传入。但是这样会造成头文件循环依赖相互包含,我想的是把Webserver类维护定时器的职能拆分出来独立为一个模块,然后Webserver和threadpool同时包含他的实例化对象,让工作线程读完之后自己判断是否删除定时器以及关闭连接。主线程只负责监听事件即可。 > > > > > >...

额,其实我觉得都大差不差,信号量某种意义上就是条件变量与互斥量的组合实现

因为最大文件描述符默认1024,但实际上这个值是可以通过命令去修改的

可能你的机器默认值已经被改了 用这个命令ulimit -n去看