免费注册 查看新帖 |

Chinaunix

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

[其他] 【(LUA相关)一个支持yield的server能避免掉轮询检查coroutine状态的命运吗?】 [复制链接]

论坛徽章:
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
21 [报告]
发表于 2013-02-24 23:41 |显示全部楼层
回复 68# linux_c_py_php


    我完全懂了………………


epoll的fd不是跟poll/select一样,是直接返回的?是epoll函数返回以后,遍历读事件列表/写事件列表/错误事件列表去依次处理有请求的fd?而是你自己搞了一个回调?

不是!不是做回调哥哥啊!!!

直接for循环那个事件列表,在循环里面根据fd查询对应coroutine,然后resume,跟回调没有半毛钱关系的!!

回调是你自己的框架搞得啊,coroutine完全不需要回调啊。

如果你坚持要回调,很简单:你做一个通用的回调,干下面的事情:

1. 根据fd查到coroutine
2. resume这个coroutine
3. 根据resume返回值爱咋地咋地

然后对所有事件都注册这唯一一个回调即可。

明白啦?

论坛徽章:
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
22 [报告]
发表于 2013-02-24 23:47 |显示全部楼层
回复 69# linux_c_py_php


    这种情况下,我直接说了吧。connect里面注册那个事件(你总得注册吧?)注册的时候userdata填lua_State*(就是那个coroutine的指针),回调函数是统一的,我写个代码你就明白了:

my_connect(fwk_handler, common_callback, L);


然后common_callback是这样的:

void common_callback(void *ud, ... /*datas*/) {
   lua_State *L = (lua_State*)ud;
   /* push datas */
   lua_resume(L, NULL, n);
   /* do any thing you want */
}

所有的异步事件(不止connect)全部使用这一个回调即可。

但是这样还是很绕,推荐你直接在epoll循环里面搞= =跟我上面说的一样= =
   

论坛徽章:
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
23 [报告]
发表于 2013-02-24 23:59 |显示全部楼层
回复 74# linux_c_py_php


    如果是回调,那就只有这样了。虽然是回调,但是大家干的事情都是一样的= =无论你的请求是什么。

在Lua层面回调转coroutine也是这么干的,用通用的回调干活。

luvit(http://luvit.io)是一个基于Lua的coroutine的框架,优势就在于= =可以不用回调= =(当然你可以用……)恩……

懂了吧?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP