lua cothread
前段时间在玩 Go ,非常喜欢 goroutine 的编程模型。采用 chan 进行 thread 间的通讯写起来很舒适。今天花了一个下午,为 lua 写了一个简单的库,模拟这种编程方式。暂且把这个东西叫作 lua cothread 。它基于 lua 的 coroutine ,只是写了个简单的调度器。
这个库有如下几个 api :
cothread.run(f,...)
启动一个函数 f ,放在调度器中。... 会被传入这个函数。这类似于 Go 的 go 关键字。
cothread.resume()
运行一个 tick 。这个库不同于 Go 的多线程模型。它是按 tick 一步步运行的。这适合于嵌入别的框架中。由框架调用一次 resume ,所有被 cothread 调度器管理的 thread 都运行一个 tick 。
resume 函数会返回当前活跃的 thread 数量。
cothread.sleep(ti)
当前 thread 休眠 ti 个 tick 。ti 可以为 0 ,但这可能会使得 resume 一直运行下去。
cothread.chan()
创建一个 chan (消息通道),不同于 Go ,这段玩具代码只有阻塞模式。当向 chan 写入时,thread 会阻塞到有另一个 thread 从这个 chan 中读取数据,或是把 chan 关闭。反之读操作亦然。
chan:read()
从 chan 中阻塞读取一个数据。如果 chan 被关闭,则返回 nil 。
chan:write()
向 chan 阻塞写一个数据,并返回 true 。如果 chan 被关闭,函数会返回 nil 。
cothread.select(tbl)
类似于 Go 的 select 。可以传入一张表。表中任何一项 chan 有数据可读时,便会触发对应的分支。表项可以填入 default 项,当没有任何备选数据时,将执行 default 项。若无 default 分支,select 将阻塞等待第一次的 chan 输入。具体使用见示例。
Comments
read 就相当于 "<- val"
write 就相当于 "val <-"
感觉这种方式替代了信号的方式相当于调用了类似WaitForSingleObject的函数。减少了锁的使用开销。
我理解的对吗?
Posted by: 李略帅 | (11) June 12, 2013 01:20 PM
请问Luaproc是不是实现了类似Goroutine模型? 谢谢!
Posted by: fisk | (10) September 1, 2011 05:06 PM
唉,虽然不知道博主写的是什么?但是为了这么多的字还是留一下言吧。
Posted by: 宁波LED | (9) December 22, 2010 08:11 PM
是啊!呵呵
Posted by: music265 | (8) December 19, 2010 03:02 PM
有什么开发用途呢?其他平台的游戏语言?有空瞅瞅
Posted by: music265 | (7) December 19, 2010 02:55 PM
云风大哥,知道你一直在带领团队开发3D游戏引擎项目,啥时候能玩上你的新3D引擎的游戏啊...期待中...
Posted by: sendee | (6) December 16, 2010 08:05 PM
这是什么语言啊,它有什么开发用途呢?其他平台的游戏语言?有空瞅瞅
Posted by: Anonymous | (5) December 16, 2010 09:27 AM
顶起了啊 嘿嘿
Posted by: 流浪 | (4) December 15, 2010 03:09 PM
学习了。#
Posted by: xiaodao | (3) December 15, 2010 01:59 AM
NICE~
Posted by: final | (2) December 14, 2010 10:46 PM
抢sf啦。
Posted by: kmplayer | (1) December 14, 2010 09:19 PM