协同线程与协同函数
协同线程
Lua中有一种特殊的线程,称为coroutine,协同线程,简称协程。
其可以在运行时暂停执行,然后转去执行其他线程,然后可以返回再继续执行没完成的内容。即可以"走走停停,停停走走"。
任意时刻只会有一个协程执行,不会出现多个协程同时执行的情况。
协同线程的类型为thread,其启动、暂停、重启等,通过函数来控制,具体方法如下:
lua
-- 创建一个协同线程实例
co = coroutine.create(function(a,b)
print(a,b,a+b)
-- 获取正在运行的协同线程实例
local co = coroutine.running()
-- 输出协同线程实例的状态
print(coroutine.status(co))
-- 将当前协同线程挂起
coroutine.yield()
print("协同线程恢复了")
end)
-- 启动协同线程
coroutine.resume(co,1,2)
-- 输出协同线程的状态
print("主线程查看协同线程状态:"..coroutine.status(co))
-- 恢复协同线程的运行,不传后面的参数了,因为协同线程已经挂起了
coroutine.resume(co)
-- 输出协同线程的状态
print("主线程查看协同线程状态:"..coroutine.status(co))
运行结果如下:
协同函数
协同线程可以单独创建执行,也可以通过协同函数调用启动执行。
使用coroutine的wrap()函数创建的就是协同函数,类型为function。
协同函数的调用会启动其内置的协同线程。
lua
-- 创建一个协同函数
co = coroutine.wrap(function(a,b)
print(a,b,a+b)
local co = coroutine.running()
print(coroutine.status(co))
coroutine.yield()
print("协同线程恢复了")
print(a,b,a+b)
end)
-- 调用协同函数,启动协同线程
co(1,2)
co()
运行结果如下
文件IO
文件IO的函数分为两类:静态函数与实例 函数。
静态函数:通过io.xxx()方式对文件进行操作。
实例函数:通过面向对象的方式操作。
常用静态函数
-
io.open() 以指定模式打开文件,返回文件对象。
格式:io.open(filename,mode)
模式mod有三种:
- r:只读,默认模式
- w:只写,会覆盖原内容
- a:只写,追加写入
- +:增加符,在r+ ,w+,a+均变为了读写
- b:二进制符,如果文件为二进制文件。则需要变为rb、wb、ab
-
io.input() 指定要读取的文件
格式:io.input(file)
-
io.output() 指定要写入的文件
格式:io.output(file)
-
io.read() 以指定格式读取io.input(file)中的内容。
格式:io.read(format)
format 的格式有:
- *l:从当前位置的下一个位置读取整行,默认格式
- *n:读取下一个数字
- *a:从当前位置的下一个位置读取整个文件
- number:这是一个数字,表示要读取的的字符的个数
-
io.write(data) 将数据data写入到io.output()中指定的文件
lua
-- 以只读方法打开一个文件
local file = io.open("test.txt","r")
io.input(file)
-- 读取文件内容并输出
local content = io.read("*a")
print(content)
-- 关闭文件
file:close()-- 以只读方法打开一个文件
local file = io.open("test.txt","r")
io.input(file)
-- 读取文件内容并输出
local content = io.read("*a")
print(content)
-- 关闭文件
file:close()
-- 以追加方法打开一个文件
local file = io.open("test.txt","a")
io.output(file)
-- 向文件中写入内容
io.write("这是追加的内容\n")
-- 关闭文件
file:close()
常用实例函数
-
file:read() :这里的file是io.open() 返回的file,用法与io.read()相同
-
file:write():与io.write()相同
-
file:seek():获取或设置文件读写指针的位置。位置从1开始,除文件最后一行外,每行都有行结束符,其占两个字符位置。
位置0 表示文件第一个位置。
格式:file:seek(whence,offset)
当seek()无参时,返回读写指针的位置。
参数whence有三种,表示将指针定位到不同位置。
参数offset 表示相对于whence 位置的偏移量,offset默认0,为正表示向后偏移,为负表示向前偏移。
whence的三种值:
1. set:将指针定位到文件开头处,即0位置处
2. cur:指针保持当前位置不变,默认
3. end:将指针定位到文件结尾处
lua
-- 以只读方法打开一个文件
file = io.open("test.txt","r")
-- 读取文件内容并输出
local content = file:read("*a")
print(content)
-- 关闭文件
file:close()
-- 以追加方法打开一个文件
file = io.open("test.txt","a")
-- 向文件中写入内容
file:write("这是追加的内容\n")
-- 关闭文件
file:close()
file = io.open("test.txt","r")
pos= file:seek()
print("当前文件指针位置:"..pos)
-- 将文件指针移动到文件开头
file:seek("set",0)
pos= file:seek()
print("当前文件指针位置:"..pos)
-- 将文件指针移动到文件末尾
file:seek("end",0)
pos= file:seek()
print("当前文件指针位置:"..pos)
file:close()