免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: codechurch

[C] 寻求建议,关于异步编程 [复制链接]

论坛徽章:
0
发表于 2014-12-30 16:34 |显示全部楼层
回复 60# yulihua49

其实,一个业务流程,除了在线程里执行,就是等待io完成,没有其他状态。

如果你想把一个业务流程写在一个函数里,就必须自始至终保留这个栈。




   

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
发表于 2014-12-30 16:58 |显示全部楼层
本帖最后由 yulihua49 于 2014-12-30 17:14 编辑
codechurch 发表于 2014-12-30 16:34
回复 60# yulihua49

其实,一个业务流程,除了在线程里执行,就是等待io完成,没有其他状态。

对呀,你仔细跑一下38楼的流程,
服务请求 还有两个状态:没有开始和已经结束。
从没有开始到开始(一个epoll事件发生了,AIO_flg==0)的状态转换,分配资源。已经结束(swapcontext返回,AIO_flg==0),释放资源。
中间那两个状态,资源肯定是在的啊!
比如,一个终端,静止时,请求没有开始。一个客人来了,要查询一下车票,发出一个请求,epoll产生一个事件,这时,请求开始,分资源。
以后操作,得结果,发送回去,这时的IO,可能一下就完成了,或者挂起,这时资源都是在的。发送完毕,任务结束,返回。
AIO_flg==0,释放资源。。。。。
这个流程没问题吧?
注意,一般的交易服务器,都是操作数据库的,栈的使用,不是你想怎样就可以怎样的。你留的太少,会出问题。

论坛徽章:
0
发表于 2014-12-30 17:20 |显示全部楼层
回复 62# yulihua49


那么,你跟我的设计本质上没有差别。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
发表于 2014-12-30 17:38 |显示全部楼层
本帖最后由 yulihua49 于 2014-12-30 17:42 编辑
codechurch 发表于 2014-12-30 17:20
回复 62# yulihua49

就是省一点栈。
任务存在,请求静止时(这个阶段,量最大,时间最长),TCB是有的,但是没有栈,第一个epoll响应期间使用的是线程栈,随后才给他分配。
就是被线程抓住后才有栈,所以栈的需求是2*线程数,比你那个少多了。

我打字慢,前边的贴子改了一些,你再重新看看。

论坛徽章:
0
发表于 2014-12-31 09:22 |显示全部楼层
回复 64# yulihua49

任务存在,但任务没有状态,这也不需要分配栈。

只有需要进行业务操作了,就需要有业务状态,这才有栈。

   

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
发表于 2014-12-31 21:21 |显示全部楼层
本帖最后由 yulihua49 于 2014-12-31 21:23 编辑
codechurch 发表于 2014-12-31 09:22
回复 64# yulihua49

任务存在,但任务没有状态,这也不需要分配栈。

对。没有状态也是一种状态。我们叫静止状态。
这时他的fd在epoll里等待,不需要栈,一旦激活,先使用线程栈,稍候转成自己栈。

论坛徽章:
35
双子座
日期:2014-05-09 17:56:38程序设计版块每日发帖之星
日期:2015-08-30 06:20:00程序设计版块每日发帖之星
日期:2015-12-24 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-27 11:07:07程序设计版块每日发帖之星
日期:2016-01-12 06:20:0015-16赛季CBA联赛之北京
日期:2016-01-15 01:01:2115-16赛季CBA联赛之浙江
日期:2016-01-15 22:38:20程序设计版块每日发帖之星
日期:2016-01-18 06:20:00每日论坛发贴之星
日期:2016-01-18 06:20:0015-16赛季CBA联赛之北控
日期:2016-01-30 21:43:01程序设计版块每日发帖之星
日期:2016-02-08 06:20:0015-16赛季CBA联赛之山西
日期:2016-02-20 10:54:41
发表于 2015-01-03 09:08 来自手机 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
发表于 2015-01-04 13:51 |显示全部楼层
本帖最后由 yulihua49 于 2015-01-04 20:02 编辑
__BlueGuy_ 发表于 2015-01-03 09:08
我现在 相当怀疑 yulihua 的技术

怀疑无罪。你可以使用windoze的技术,除了,大量客户入场,内存够不够的问题。
我也是在探索中,正在进行压力测试。

各种中间件的通信模式:
消息中间件:单向。
交易中间件:双向半双工。
游戏和P2P中间件:双向全双工。

我做交易中间件,半双工,有明确的静止期、工作期。所以可以用我这办法。
你要全双工,服务器随时可向一批客户端推送信息,没有明确的静止期,所以我这办法不合适。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
发表于 2015-01-04 20:07 |显示全部楼层
yulihua49 发表于 2015-01-04 13:51
怀疑无罪。你可以使用windoze的技术,除了,大量客户入场,内存够不够的问题。
我也是在探索中,正在进行 ...


今天做了第一阶段的压力测试,大量TCB,少量线程。看看fiber在线程的冲突。基本成功了。当然程序是修改了一些。
明天做第二阶段的压力测试,大量客户端,大量线程,测试线程间冲突。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
发表于 2015-01-08 12:34 |显示全部楼层
windoze 发表于 2014-12-26 15:37
回复 49# yulihua49

每个fiber 1M的内存用到了什么地方?是保存session数据吗?如果是这样,你用不用fi ...

遇到难题了,求教大侠:

在coroutine中:
加锁

进行异步过程

解锁

这个序列不行啊,解锁时,不是原来的那个线程了,解不了啊,怎么办?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP