IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

lua cothread

云风的 BLOG 2010-12-14 21:59:01 累计浏览 2,947 次
本机暂存

前段时间在玩 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 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 一种常见的并发编程场景的处理 (累计阅读 23,589)
  2. 无锁消息队列 (累计阅读 14,276)
  3. 一种高效无锁内存队列的实现 (累计阅读 12,096)
  4. TT的作者出新作品鸟:kyoto tycoon (累计阅读 7,954)
  5. 程序中的“多线程” (累计阅读 7,326)
  6. 并发框架Disruptor译文 (累计阅读 6,763)
  7. Nginx与Lua (累计阅读 5,672)
  8. 7个示例科普CPU Cache (累计阅读 5,417)
  9. 进程和线程关系及区别 (累计阅读 5,360)
  10. Tips of Linux C programming (累计阅读 5,243)