Lua-Async 协程的高级用法
Lua-Async
这是一个基于协程的异步调用库, 该库的设计思路类似JavaScript的Promise, 但相比Promise, 它有更多的灵活性.
-- 引入Async
local Async = require("Async")
-- 创建Async
-- 可传递参数到接下来的调用中
Async.New(...)
-- 注册异步调用
Async.New(...)
:Ok(function(ok, no, ...) return no() end) -- 在Ok管道注册回调, 之后进入No管道
:No(function(ok, no, ...) return ok() end) -- 在No管道注册回调, 之后进入Ok管道
:Ok(function(ok, no, ...) return no() end) -- 在Ok管道注册回调, 之后进入No管道
:No(function(ok, no, ...) return ok() end) -- 在No管道注册回调, 之后进入Ok管道
-- 异常捕获
Async.New(...)
:Error(function() print("捕获异常...") end) -- 注册异常捕获函数
:Ok(function(ok, no, ...) return no() end) -- 在Ok管道注册回调, 之后进入No管道
:No(function(ok, no, ...) return ok() end) -- 在No管道注册回调, 之后进入Ok管道
:Ok(function(ok, no, ...) return no() end) -- 在Ok管道注册回调, 之后进入No管道
:No(function(ok, no, ...) return ok() end) -- 在No管道注册回调, 之后进入Ok管道
JavaScript Promise 对比
Js版本
new Promise((resolve, reject) => {
resolve(); // 下一步
})
.then((resolve, reject) => {
reject(); // 下一步
})
.catch(() => {
// 异常处理
})
Lua版本
require("Async").New()
:Ok(function(ok, no)
return ok() -- 下一步
end)
:Ok(function(ok, no)
return no() -- 下一步
end)
:No(function(ok, no)
return no() -- 异常处理
end)
简单的使用例子
-- 一个简易的定时器
local Timer = {
mTasks = {}
}
-- 为定时器插入一个任务
function Timer:Insert(tick, func)
table.insert(self.mTasks, { mTick = os.clock() + tick, mFunc = func })
end
-- 更新定时器
function Timer:Update(tick)
local dels = {}
local time = os.clock()
for k, task in pairs(self.mTasks) do
if task.mTick <= time then
table.insert(dels, k)
task.mFunc()
end
end
for i, v in ipairs(dels) do
self.mTasks[v] = nil
end
end
-- 3层嵌套异步调用
Timer:Insert(2, function()
print("clock: \t", os.date("%y-%m-%d %H:%M:%S"))
Timer:Insert(2, function()
print("clock: \t", os.date("%y-%m-%d %H:%M:%S"))
Timer:Insert(2, function()
print("clock: \t", os.date("%y-%m-%d %H:%M:%S"))
end)
end)
end)
-- 通过Async 3层异步调用
require("Async").New()
:Ok(function(ok, no)
Timer:Insert(2, function() print("Async clock: ", os.date("%y-%m-%d %H:%M:%S")) ok() end)
end)
:Ok(function(ok, no)
Timer:Insert(2, function() print("Async clock: ", os.date("%y-%m-%d %H:%M:%S")) ok() end)
end)
:Ok(function(ok, no)
Timer:Insert(2, function() print("Async clock: ", os.date("%y-%m-%d %H:%M:%S")) ok() end)
end)
while true do
Timer:Update(os.clock())
end
**调用结果**
> C:\MyWork\Git\Lua-Async>lua demo.lua
> clock: 19-12-17 21:00:23
> Async clock: 19-12-17 21:00:23
> clock: 19-12-17 21:00:25
> Async clock: 19-12-17 21:00:25
> clock: 19-12-17 21:00:27
> Async clock: 19-12-17 21:00:27
调用结果
C:\MyWork\Git\Lua-Async>lua demo.lua
clock: 19-12-17 21:00:23
Async clock: 19-12-17 21:00:23
clock: 19-12-17 21:00:25
Async clock: 19-12-17 21:00:25
clock: 19-12-17 21:00:27
Async clock: 19-12-17 21:00:27
Lua-Async 协程的高级用法的更多相关文章
- Lua的协程和协程库详解
我们首先介绍一下什么是协程.然后详细介绍一下coroutine库,然后介绍一下协程的简单用法,最后介绍一下协程的复杂用法. 一.协程是什么? (1)线程 首先复习一下多线程.我们都知道线程——Thre ...
- Lua的协程(coroutine)
-------------------------------------------------------------------------------- -- 不携带参数 ---------- ...
- Lua的协程基础
参考:Lua中的协同程序 coroutine http.lua 协同程序(Coroutine): 三个状态:suspended(挂起,协同刚创建完成时或者yield之后).running(运行). ...
- 用Lua的协程实现类似Unity协程的语句块
local co_time_tbl = {} setmetatable(co_time_tbl, { __len = function(o) for k, v in pairs(o) do count ...
- lua 15 协程-协同程序
转自:http://www.runoob.com/lua/lua-coroutine.html 什么是协同(coroutine)? Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈 ...
- Lua 协程coroutine
协程和一般多线程的区别是,一般多线程由系统决定该哪个线程执行,是抢占式的,而协程是由每个线程自己决定自己什么时候不执行,并把执行权主动交给下一个线程. 协程是用户空间线程,操作系统其存在一无所知,所以 ...
- lua协程并发下载简单测试
下载8个1m大小文件,测试五次分别耗时12.038s,10.316s,8.955s,11.275s,9.499s(lua代码实现如下) require "socket" --hos ...
- [转]skynet Lua中的协程
Lua中的协程 http://www.outsky.org/code/lua-coroutine.html Sep 6, 2014 Lua中的协程和其他变量一样,都是第一类值(first-class ...
- lua编程之协程介绍
一,lua协程简介 协程(coroutine),意思就是协作的例程,最早由Melvin Conway在1963年提出并实现.跟主流程序语言中的线程不一样,线程属于侵入式组件,线程实现的系统称之为抢占式 ...
随机推荐
- webpack优化之玩转代码分割和公共代码提取
前言 开发多页应用的时候,如果不对webpack打包进行优化,当某个模块被多个入口模块引用时,它就会被打包多次(在最终打包出来的某几个文件里,它们都会有一份相同的代码).当项目业务越来越复杂,打包出来 ...
- nyoj 94-cigarettes (分清楚,那一部分的cigarettes是用过的,那一部分是没有用过的)
94-cigarettes 内存限制:64MB 时间限制:3000ms 特判: No 通过数:13 提交数:20 难度:2 题目描述: Tom has many cigarettes. We hypo ...
- 自动安装 linux 系统
实现自动安装 centos 6 和 centos 7 实现自动安装 Linux 系统需要在虚拟机上安装三个服务:apache .tftp.dhcp 三个服务放在一台虚拟机上即可 一.DHCP 服务器的 ...
- 领扣(LeetCode)最长和谐子序列 个人题解
和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是1. 现在,给定一个整数数组,你需要在所有可能的子序列中找到最长的和谐子序列的长度. 示例 1: 输入: [1,3,2,2,5,2,3,7] ...
- ZeroC ICE中的对象
在ZeroC Ice中定义了三种基本对象类型. 它们分别是IceProxy::Ice::Object(于Ice/Proxy.h),Ice::Object(于Ice/Object.h)和Ice::Loc ...
- Linux下的磁盘分区,和创建文件系统(理论及实战)
首先我们先了解一下磁盘的原理 磁盘的数据结构有: 扇区:盘片被分为多个扇形区域,每一个扇区存放512个字节的数据 磁道:同一个盘片不同半径的同心圆 柱面:不同盘片相同半径构成的圆柱面 公式: 磁盘存储 ...
- 将py文件打包为exe文件方法
前提: pip是依赖python的,首先检查下windows机器上有没有安装python,或者有没有添加到环境变量中,如果都没有需要安装或者加入环境变量 安装pip 下载地址: https://pyp ...
- mysql通俗易懂的数据库连接池原理及模拟实现
什么是数据库连接池? 当系统使用JDBC技术访问数据库时会创建一个connection对象,而该对象的创建过程是非常消耗资源的,并且创建对象的时间也特别长,假设系统一天有1万次的访问量,那么一天就会有 ...
- JAVA中字符串常见操作
String str1="hello,world";String str2="Hello,World"; 1.字符串的比较:例,System.out.print ...
- Python开发-实现Excel套打打印
一.目的 目前本人就职与甲方的工作,由于公司的ERP比较烂无法完美的设计套打,就想着自己用Python开发一个套打工具. 二.开发过程 刚开始我打算用Html的方式生成打印的文档,但是有两个无法解决的 ...