免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: xxxxxxxp
打印 上一主题 下一主题

[C++] [换个地方发]请教大牛:异步io的优点究竟在哪 [复制链接]

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
41 [报告]
发表于 2013-01-21 17:16 |只看该作者
回复 39# starwing83

Leader/Follower倒不全是卖名词,它毕竟和“线程池”还是有点区别的。

在一些OS上,如果一堆线程一起accept,在连接发生时会有惊群的现象,Leader/Follower Pattern限定只有Leader做accept,这样能避免惊群。
不过现在的OS应该都把这个问题解决了,所以干脆一堆线程一起accept效果也一样,代码也简单。

PS. 奇怪啊,刚才试过s啊?怎么刚才不好使现在就好使了?

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
42 [报告]
发表于 2013-01-21 17:26 |只看该作者
回复 40# linux_c_py_php


    网上查了一下,Reactor不是单线程的干活么?有篇文章举了个例子,就是说一个客人点餐的时候服务员可以离开,然后等点完了叫服务员就再回来。这不就是coroutine的原理么?本质上就是协作式多线程了啊,那还加个p的锁啊?

难道你说的Reactor和我搜到的含义不一样?

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
43 [报告]
发表于 2013-01-21 17:31 |只看该作者
本帖最后由 linux_c_py_php 于 2013-01-21 17:33 编辑

最简单的reactor就是每个线程都accept的, 但惊群弄得它基本不可用, 所以有apache那种架构的单线程accept+queue+thread pool的reactor优化版, 这一版和lf已经相差无几了.

starwing83 发表于 2013-01-21 17:26
回复 40# linux_c_py_php

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
44 [报告]
发表于 2013-01-21 17:32 |只看该作者
本帖最后由 windoze 于 2013-01-21 17:32 编辑

回复 42# starwing83

Reactor本身只是一个多路分离器,后面可以跟一个线程池……好吧……一堆工作线程……

   

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
45 [报告]
发表于 2013-01-21 17:33 |只看该作者
回复 43# linux_c_py_php


    ……还是没觉得这货有啥技术含量= =

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
46 [报告]
发表于 2013-01-21 17:33 |只看该作者
没错, 完全没技术含量, 但在当初那个时候它总结出来写了个paper, 就有了俩显得很牛逼的名字.

starwing83 发表于 2013-01-21 17:33
回复 43# linux_c_py_php

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
47 [报告]
发表于 2013-01-21 17:35 |只看该作者
回复 44# windoze


    这么说我懂了。其实我说的方法就是一个reactor的变形。

用一个线程池做多路的accept(反正现在没惊群问题了= =)然后能处理的处理,不能处理的往队列扔。队列满了就等~(或者加内存= =)另一个线程池从队列取数据,然后开始处理,和IO什么的不沾边。

如果是纯数据流的话,做成共享内存的两个进程都行。

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
48 [报告]
发表于 2013-01-21 17:40 |只看该作者
在reactor的基础上, 还有每个线程epoll监听一堆的fd的写法(memcached), 不过在最初没有epoll的时候(select默认也就撑前1024个fd吧), 一个线程处理一个fd使用
SO_RCVTIMEO选项阻塞读得年代... reactor和lf算是网络编程的正解吧- -


linux_c_py_php 发表于 2013-01-21 17:33
没错, 完全没技术含量, 但在当初那个时候它总结出来写了个paper, 就有了俩显得很牛逼的名字.

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
49 [报告]
发表于 2013-01-21 18:02 |只看该作者
本帖最后由 windoze 于 2013-01-21 18:03 编辑

回复 47# starwing83

这样的做法就叫HSHA(Half-Sync-Half-Async,木办法,再卖个名词),
LF和它的区别就在于LF没有中间的那个queue,也没有一个/一组专门的IO线程。
LF的做法是,哪个是Leader哪个就轮上去做IO,拿到一块数据就退休,把Leader交给某一个Follower,自己去干活,干完了之后再作为Follower给在当前的Leader屁股后面。
HSHA的做法是,一个/一组IO线程做IO,拿到数据就扔到一个queue里,queue后面有一堆工作线程/进程等着干活。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
50 [报告]
发表于 2013-01-21 18:06 |只看该作者
回复 49# windoze


    Good……我估计是学网页制作的文科生太多了…………

不过我想的办法有了一个名字,而且和4G标准如此之象,我深感欣慰

那么,LF/Reactor/HSHA这三种方法之间如何比较呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP