【Lua笔记】、Lua 协程

Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈,独立的局部变量,独立的指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。

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

create

创建coroutine,返回coroutine,参数是一个函数,当和resume配合使用的时候就唤醒函数调用

resume

重启 coroutine,和create 配合使用

wrap

创建coroutine,返回一个函数,一旦你调用这个函数,就进入coroutine,与create的区别在于不需要使用resume唤醒。

yield

1、将 coroutine 设置为挂起状态,等候再次resume触发事件.
2、yield将函数的参数处理之后返回给resume,
3、定义下一次唤醒时需要传递的参数。
4、下一次执行协程从该yield挂起处开始执行,并将resume的参数传入yield赋值给函数使用。

status

查看 coroutine 的状态注:coroutine 的状态有三种:dead,suspended,running

running

返回正在跑的 coroutine,一个coroutine就是一个线程,当使用running的时候,就是返回一个 corouting 的线程号

示例:

local function func(a)
	print("第一次协同程序执行输出", a) -- 第一次传的参数 1
    local a = coroutine.yield(a+10,"返回主线程") -- 返回11 -- 第二次调用resume的参数2赋值给a
		
    print("第二次协同程序执行输出", a) --2
    local a = coroutine.yield(a+100,"返回主线程")  -- 返回102  -- 第二次调用resume的参数3赋值给a
     
    print("第三次协同程序执行输出", a) -- 3
    return a, "结束协同程序"          --最后一次赋值的a
end

co = coroutine.create(func,a)
       
print("main", coroutine.resume(co, 1)) -- true, 11
print("------------------------------")
print("main", coroutine.resume(co, 2)) -- true 102	
print("------------------------------")
print("main", coroutine.resume(co, 3)) -- true 3
print("------------------------------")
print("main", coroutine.resume(co, 4)) -- cannot resume dead coroutine
print("------------------------------")

调用resume将协程成功唤醒,返回true。
运行协程(co)里面的函数(func),将resume的其他参数作为函数(func)的参数开始执行,直到遇到yield将协程(co)挂起。
在yield处返回,并将yield的参数处理之后返回主线程。
第二次调用resume,在上一次挂起(yield)的地方开始执行,将传入的其他参数作为此yield的返回值。
依次类推直到该函数执行完成。

resume和yield的配合强大之处在于,resume处于主程中,它将外部状态(数据)传入到协同程序内部;而yield则将内部的状态(数据)返回到主程中。

猜你喜欢

转载自blog.csdn.net/qq_33461689/article/details/127075382