免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
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
31 [报告]
发表于 2013-02-24 22:13 |只看该作者
windoze 发表于 2013-02-24 22:05
这一点是错的,server等待事件,然后同步执行事件对应的session关联的lua脚本,只不过lua脚本跑一段就会返 ...


你理解错了, resume只有第一次是server发起的,后续的都是api发起的,你根本无从检查。

论坛徽章:
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
32 [报告]
发表于 2013-02-24 22:18 |只看该作者
本帖最后由 linux_c_py_php 于 2013-02-24 22:19 编辑

我觉得我问的问题很明显啊, 要么让lua通知server, 要么让server检查lua, 有别的办法吗?

我给lua脚本做一层C的wrapper来pcallk调用lua脚本, 只要lua脚本返回到我的wrapper, 那么说明lua脚本return了, 于是我可以通过我自己设计的方式(比如管道)在wrapper里来通知server该coroutine执行完成, 我觉得就这么一个道理, 但不知道比较传统正规的做法是不是我这样?

又或者server在每次eventloop里轮询检查coroutine的状态是否dead,这样也可以做到。


请设想lua脚本调用若干异步接口的情况,resume除了主框架发起第一次以外,后续的yield与resume和框架半毛钱关系也没有,框架是不知道lua何时结束的,这一点有什么异议吗?

论坛徽章:
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
33 [报告]
发表于 2013-02-24 22:20 |只看该作者
windoze 发表于 2013-02-24 22:05
这一点是错的,server等待事件,然后同步执行事件对应的session关联的lua脚本,只不过lua脚本跑一段就会返 ...


还有, 这和多线程没半毛钱关系, 单线程和LF多线程对这一个东西的实现没有半毛钱影响。

论坛徽章:
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
34 [报告]
发表于 2013-02-24 22:21 |只看该作者
回复 31# linux_c_py_php

唉…………
怎么说呢,你觉得你设想的这个模型是coroutine还是直接的多线程异步?

论坛徽章:
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
35 [报告]
发表于 2013-02-24 22:23 |只看该作者
本帖最后由 linux_c_py_php 于 2013-02-24 22:25 编辑
windoze 发表于 2013-02-24 22:21
回复 31# linux_c_py_php

唉…………


就是C层面的epoll事件, 每个连接用coroutine跑lua, 对于lua开发者来说是阻塞逻辑, 对于C层面是异步逻辑.

等lua自己在我的Epoll支持下异步跑完了它所有的代码(比如我提供给它看起来阻塞, 实际异步的connect, write, read等接口, 这些接口底层全是挂在我epoll下跑的, 并且借助lua的resume/yield做为协程随着epoll触发接连调用), C层面需要知道这个事实并继续解析下一个请求, 就这么浅显的道理, 我觉得没有交流障碍吧.

论坛徽章:
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
36 [报告]
发表于 2013-02-24 22:27 |只看该作者
问题就这么摆着了, 我认为一个connection对应的coroutine处理一个request执行了一次lua, 当lua跑完了, 我的server不知道这个connection的coroutine跑完了, 所以一直等着, 我需要一个方式让server知道, 要么轮询, 要么让coroutine通知server。

难道大家根本没遇到这个问题? 这和half-sync-half-async的队列通知有什么区别,异步层在等同步层的应答,早晚得有个东西告诉异步层可以继续下一个请求了。

论坛徽章:
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
37 [报告]
发表于 2013-02-24 22:30 |只看该作者
回复 29# linux_c_py_php


    显然是你执迷不悟了。

一个coroutine对应的是一个fd,而不是一个请求,如果一个coroutine只对应一个请求,搞定了就销毁,那么你搞coroutine干嘛?coroutine的优点就是在处理多个请求的时候阻塞啊。单个请求难道不是处理完了就直接return么?

也就是说,一个fd发来一个请求,你resume这个coroutine,告诉他"new"了一个新的请求(对应GUI例子里面wait返回"down"),然后当有数据传递的时候,你resume这个coroutine高速他"read"新的数据(对应GUI例子里面wait返回"move"),coroutine是不是处理这个请求,是不是读完所有数据,coroutine说了算,如果它dead了,就代表它不打算处理完所有数据了,直接喀嚓掉这个fd。

如果当前请求完毕,再有新的请求到来,继续resume那个coroutine,告诉他"new"了一个新的请求,其余的就完全一样了。

coroutine和fd相关,不和请求相关。

如果要和请求相关也容易,预先保存一份chunk(Lua代码),当"new"的时候,判断coroutine是不是有yield的内容, 不管是什么情况,都直接error出来到pcall,然后继续push那个chunk,然后resume,这样一个coroutine就可以被反复利用,从逻辑上就是一个请求一个coroutine,请求完毕coroutine被废,但物理上coroutine是被反复利用的。

再强调一点,来一个事件(新请求或者读请求都是事件,甚至出错都是时间),告诉coroutine事件的类型,然后执行一段代码,然后就不管了。是resume控制coroutine执行,而不是反过来coroutine告诉自己执行完了没——resume返回就意味着coroutine一定执行完了。

论坛徽章:
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
38 [报告]
发表于 2013-02-24 22:37 |只看该作者
回复 35# linux_c_py_php

用epoll等待下一个事件,然后回调lua coroutine,这难道不是同步调用?
lua coroutine返回后,你难道不能检查coroutine是dead还是paused?
你觉得在这个过程中lua脚本和epoll循环有什么地方是“异步”执行的?

所以你真的理解错了。

论坛徽章:
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
39 [报告]
发表于 2013-02-24 22:39 |只看该作者
coroutine和epoll在一个cpu上, lua不阻塞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
40 [报告]
发表于 2013-02-24 22:40 |只看该作者
windoze是对的,事实上coroutine的优势就是可以跟线程完全没关系,所有过程都是同步/线性的,只有coroutine本身的执行是被交织在一起的,但是它们本身的执行过程依然是同步的,没有任何的并发。

另一个优势是,要并发也是非常容易的:建立多个State即可,你必须保证不要使用全局变量——当然,Lua5.2也已经没有全局变量了= =
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP