免费注册 查看新帖 |

Chinaunix

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

[技术动态] 今天听说了腾讯一个很牛逼的技术, 求问是怎么实现的 [复制链接]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
11 [报告]
发表于 2014-08-04 00:43 |只看该作者
这种方式如果nonblocked_query()报错,处理起来应该非常蛋疼

论坛徽章:
0
12 [报告]
发表于 2014-08-04 10:47 |只看该作者
这个关键在于调度,阻塞调用进入内核时,也是转换成异步的,因为内核本身拥有调度功能。对于上层来说就是如何模拟或者实现类似的过程。

如果有兴趣可以参考这个项目https://github.com/zhouzhenghui/c-sigslot,虽然目前还没有上传全部代码,但理解其中的概念的话就明白可以如何实现了。

c++中的实现可以参考boost.asio的coroutine,或者在boost.context/coroutine基础上自己实现一个。来自微软的Herb Sutter团队正在给C++提交实现类似功能的提案,resumable function等等

论坛徽章:
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
13 [报告]
发表于 2014-08-04 10:58 |只看该作者
Fiberized.IO就是干这个的,也不是很麻烦的说。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
14 [报告]
发表于 2014-08-04 13:08 |只看该作者
一堆做广告的。。。。。。

论坛徽章:
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
15 [报告]
发表于 2014-08-04 13:55 |只看该作者
回复 14# zylthinking

给自己做做广告又不犯法

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
16 [报告]
发表于 2014-08-04 14:04 |只看该作者
看楼主的代码,
没有发现更改后有什么不同~~
奇怪的是下面的各大牛们回答地津津有味~~

论坛徽章:
4
双子座
日期:2014-08-28 10:08:002015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:58:112015年亚洲杯之阿联酋
日期:2015-03-13 03:25:15
17 [报告]
发表于 2014-08-04 14:44 |只看该作者
我来说一下吧,其实异步大多数情况下就是网络发包,原来是send-》recv, send-》recv现在编程send,send -》recv,recv 只是前提是协议是支持哪个回包是哪个请求的。  因为send的时间可以忽略不计,但是recv的时间是取决于后端的处理速度的,所有由原来的N倍时间变成了max(1...N)的时间了

论坛徽章:
0
18 [报告]
发表于 2014-08-04 22:12 |只看该作者
回复 16# folklore

folk一针见血,但我已经指明了对方讨论的实际上是代码调度,这里所谓阻塞非阻塞,并不是在局部代码上体现出来的,而是整体的执行过程中。

也就是说上述代码位于的函数在被调用时会不会阻塞调用者(当然这不是一般调用者),如果不明白可以看一下boost.asio的corutine的范例。其实现实际上是一个异步可重入函数,只是每次重入后会延续上次执行过的地方继续执行。

C#在(模仿boost.asio)引入了async/await关键字来简化这一过程,后来微软的c++组就一直在搞这方面的研究,提出了一系列的提案,就是为了方面异步/并发编程,但其实他们做的还不够。
   

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
19 [报告]
发表于 2014-08-05 09:47 |只看该作者
各种高大上啊, 其实关键只有一个, 就是后台线程代你执行, 仅此而已;
可以论证: 当面对一个阻塞且无法修改的第三方 API 时, 要么不调用, 要调用控制权就会进入第三方库, 你做不到即调用又能返回; 因此所谓阻塞变异步, 要么该函数根本是可以不阻塞的, 要么就是在后台偷偷摸摸起了另一个线程代你执行, 你自己要么被安排干一些其他事, 要么干等, 自然, 干等还不如自己直接调用呢

论坛徽章:
7
天蝎座
日期:2013-09-28 10:45:42双子座
日期:2013-10-16 16:27:09射手座
日期:2013-10-23 10:21:32处女座
日期:2014-09-17 16:44:332015年亚洲杯之巴林
日期:2015-04-09 17:28:01冥斗士
日期:2015-11-26 16:19:0015-16赛季CBA联赛之山东
日期:2018-03-02 23:59:31
20 [报告]
发表于 2014-08-05 19:24 |只看该作者
本帖最后由 cxytz01 于 2014-08-05 19:26 编辑

lz可以参考python gevent,就是干这个,协程的概念。

gevent可以把所有的socket封装成非阻塞模式,并且不用改代码。

中心思想就是:事件驱动,协程。

http://coolshell.cn/articles/10975.html

ps:我没看过gevent的代码。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP