首页 技术 正文
技术 2022年11月14日
0 收藏 930 点赞 4,953 浏览 2722 个字

一.lua协同程序coroutine

1.什么是协同(coroutine)?
Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈,独立的局部变量,独立的指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。
协同是非常强大的功能,但是用起来也很复杂。

2.线程和协同程序区别

线程与协同程序的主要区别在于,一个具有多个线程的程序可以同时运行几个线程,而协同程序却需要彼此协作的运行。在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只有在明确的被要求挂起的时候才会被挂起。协同程序有点类似同步的多线程,在等待同一个线程锁的几个线程有点类似协同。

3.基本语法

coroutine.create()创建coroutine,返回coroutine, 参数是一个函数,当和resume配合使用的时候就唤醒函数调用
coroutine.resume()重启coroutine,和create配合使用
coroutine.yield()挂起coroutine,将coroutine设置为挂起状态,这个和resume配合使用能有很多有用的效果
coroutine.status()查看coroutine的状态
注:coroutine的状态有三种:dead,suspend,running,具体什么时候有这样的状态请参考下面的程序
coroutine.wrap()创建coroutine,返回一个函数,一旦你调用这个函数,就进入coroutine,和create功能重复
coroutine.running()返回正在跑的coroutine,一个coroutine就是一个线程,当使用running的时候,就是返回一个corouting的线程号

示例
— coroutine_test.lua 文件
co = coroutine.create(
function(i)
print(i);
end
)
coroutine.resume(co, 1) — 1
print(coroutine.status(co)) — dead

print(“———-“)

co = coroutine.wrap(
function(i)
print(i);
end
)
co(1)

print(“———-“)

co2 = coroutine.create(
function()
for i=1,10 do
print(i)
if i == 3 then
print(coroutine.status(co2)) –running
print(coroutine.running()) –thread:XXXXXX
end
coroutine.yield()
end
end
)
coroutine.resume(co2) –1
coroutine.resume(co2) –2
coroutine.resume(co2) –3

print(coroutine.status(co2)) — suspended
print(coroutine.running())

二.文件/IO

Lua I/O 库用于读取和处理文件。分为简单模式(和C一样)、完全模式。
简单模式(simple model)拥有一个当前输入文件和一个当前输出文件,并且提供针对这些文件相关的操作。
完全模式(complete model) 使用外部的文件句柄来实现。它以一种面对对象的形式,将所有的文件操作定义为文件句柄的方法

1.打开文件操作语句:
file = io.open (filename [, mode])
mode的值有:
r以只读方式打开文件,该文件必须存在。
w打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
a以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
r+以可读写方式打开文件,该文件必须存在。
w+打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a+与a类似,但此文件可读可写
b二进制模式,如果文件是二进制文件,可以加上b
+号表示对文件既可以读也可以写

2.示例:
— 以只读方式打开文件
file = io.open(“test.lua”, “r”)

— 设置默认输入文件为 test.lua
io.input(file)

— 输出文件第一行
print(io.read())

— 关闭打开的文件
io.close(file)

— 以附加的方式打开只写文件
file = io.open(“test.lua”, “a”)

— 设置默认输出文件为 test.lua
io.output(file)

— 在文件最后一行添加 Lua 注释
io.write(“– test.lua 文件末尾注释”)

— 关闭打开的文件
io.close(file)

三,错误处理

1.使用函数error,assert
(1)assert如果同时检查两个参数 首先检查第一个参数,如果没有问题就不做任何事情
如:
assert(type(a) == “number”, “a 不是一个数字”) –打印提示
assert(type(b) == “number”, “b 不是一个数字”) — 报错
error语法如下:
(2)error (message [, level])
功能:终止正在执行的函数,并返回message的内容作为错误信息(error函数永远都不会返回)
通常情况下,error会附加一些错误位置的信息到message头部。
Level参数指示获得错误的位置:
Level=1[默认]:为调用error位置(文件+行号)
Level=2:指出哪个调用error的函数的函数
Level=0:不添加错误位置信息

2.使用pcall 和xpcall debug
(1)pcall接收一个函数和要传递个后者的参数,并执行,执行结果:有错误、无错误;返回值true或者或false, errorinfo,pcall返回时已经销毁调用栈部分信息。
如: if pcall (functionname,param) then
–没有错误
else
–出现错误
end

(2)xpcall以一种”保护模式”来调用第一个参数,因此pcall可以捕获函数执行中的任何错误。
xpcall是接受第二个函数,可以在第二个函数里面查看错误信息,debug库提供两个处理函数
debug.debug:提供一个Lua提示符,让用户来检查错误的原因
debug.traceback:根据调用桟来构建一个扩展的错误消息

如: xpcall(
function(i)
print(i) error(‘error..’)
end,
function()
print(debug.traceback())
end
)

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,950
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,476
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,289
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,107
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,739
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,772