把 lua 和 event loop 结合起来,是不是比 js 更给力

2014-03-11 14:33:13 +08:00
 ryanking8215
js把event loop融入了它的血液了。从语法上看,lua和js相像的地方很多,大不同的地方是,lua都是同步接口,但所幸lua的core很小,是不是把它改动一下,结合libuv,也做成一个lua-async的东东,在通过luajit,是不是比js更给力?

当然,前后端大一统就没了。lua和c/c++结合比用v8简单太多了。

欢迎大家吐槽!
8182 次点击
所在节点    奇思妙想
28 条回复
darklowly
2014-03-11 14:46:18 +08:00
为什么不直接用go
seeker
2014-03-11 14:48:37 +08:00
刚搜了下搜到这个,给撸主参考参考: http://luvit.io/
mingzhi
2014-03-11 14:50:44 +08:00
lz 说的是这货 http://luvit.io/ 这样?
ryanking8215
2014-03-11 14:51:43 +08:00
golang也是同步的啊

我靠,真有这玩意儿,还说比node.js快2~4倍。
initialdp
2014-03-11 15:19:40 +08:00
国内云风开源的skynet据说也是杠杠的。
clino
2014-03-11 15:35:06 +08:00
用lua当然要用coroutine了,为什么还用event loop这种编程界面这么恶心的东东呢
ryanking8215
2014-03-11 15:54:52 +08:00
我不觉得event loop很恶心啊,嵌入式上一直用libevent。
最近觉得多线程会造成心智负担,担心死锁的问题。包括goroutine。
callback嵌套多点就多点吧,不是还有async,eventproxy么?至少我知道cpu在执行这里的时候,别的代码对这个没影响。难道是年纪大了?
alsotang
2014-03-11 16:02:02 +08:00
反正 nodejs 的嵌套很恶心就对了。
kran
2014-03-11 16:03:19 +08:00
openresty, alilua ?
clino
2014-03-11 17:02:37 +08:00
@ryanking8215 如果用同步的方式写会有死锁,那么用eventloop方式一样会有吧
superhack
2014-03-11 20:09:52 +08:00
openresty 中的 ngx_lua
ryanking8215
2014-03-11 20:54:42 +08:00
@clino 用了单进程单线程的eventloop,那就不用锁了,就不会有死锁了。死锁不是因为同步写的原因,是因为要并发,临界区资源需要互斥,有资源需要同步访问,也有可能多个任务需要协调同步等等,就有锁的问题,一不小心就会死锁,其实死锁还好,万一临界区资源被无故改写,这个问题很难查,很难重现。
suninus
2014-03-11 20:55:52 +08:00
这个点个赞,@seeker真搜度
clino
2014-03-11 21:28:35 +08:00
@ryanking8215 coroutine 一样可以是单进程单线程来并发,照你这么说也不用锁
RIcter
2014-03-11 21:33:33 +08:00
@seeker 好眼熟,我们是不是在哪见过,bathome么。。不对。。
ryanking8215
2014-03-12 09:15:40 +08:00
@clino 你指lua的coroutine吗?lua不是很熟悉,但我记得是没有锁啊
clino
2014-03-12 10:04:18 +08:00
@ryanking8215 coroutine在几种语言的实现都是单线程里并发的,照你说都不用有锁了
另外event loop就不用锁了吗?你确定吗?
ryanking8215
2014-03-12 10:20:31 +08:00
@clino 单线程单进程的event loop不需要锁,我确定。你说几种语言的coroutine的,我不是了解很多语言,单从lua讲,是单线程内执行的协程,不需要锁。 至于goroutine,是多线程支撑的CSP模型,需要锁的,它也提供的sync.Mutex,sync.Atomic,当然它提供更方便的chan是另一说了
clino
2014-03-12 10:46:14 +08:00
@ryanking8215 gevent是单线程的,它一样提供锁的工具( http://xlambda.com/gevent-tutorial/#_11 ),可以用来"限制并发访问或运行",当然也可以不用
不过 event loop 确实就没办法用了,所以在这点上也能看出这种编程接口没coroutine灵活
至于goroutine,你要想做成单线程一样也可以,这是使用者的选择,不一定非要用多线程的方式
ryanking8215
2014-03-12 11:39:13 +08:00
@clino 我看了一下gevent,我同意你的说法。我的理解是从资源保护上讲,是不需要锁的,因为gevent的cpu是用户显示释放的,不是OS调度的,没有临界区的问题,但是你要同步gevent,控制gevent的执行顺序,就需要信号量和锁了。

但是你说的关于goroutine的,我不太认同,goroutine是go runtime的调度器调度的,什么时候切换goroutine是自动的,不是用户控制的,如果没有互斥和同步原语,我觉得是有临界区问题的。我不清楚如何起n个gorouine是保证在一个线程上的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/103805

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX