IT技术博客大学习 共学习 共进步

lua cothread

云风的 BLOG 2010-12-14 21:59:01 浏览 2,863 次

前段时间在玩 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 输入。具体使用见示例。

代码和示例可以看这里

建议继续学习

  1. Go Reflect 性能 (阅读 13,668)
  2. 从Go看,语言设计(一) (阅读 6,046)
  3. Nginx与Lua (阅读 5,566)
  4. Lua GC 的源码剖析 (2) (阅读 4,944)
  5. Ameba , 一个简单的 lua 多线程实现 (阅读 4,844)
  6. go-kit 入门(一) (阅读 4,604)
  7. Lua GC 的源码剖析 (4) (阅读 4,604)
  8. 为什么我们要使用Go语言以及如何使用它的 (阅读 4,465)
  9. Go 语言初步 (阅读 4,406)
  10. Proto Buffers in Lua (阅读 4,283)