Lua之协成

Lua在主线程之外还可以运行一个协同程序。可以通过coroutine的create方法创建一个协同程序,会在yield方法的地方暂停,然后调用resume方法时继续执行。

coroutine的方法:

create(f)    创建一个协程,f为协程内执行的方法。返回协程的句柄。
resume(co,[var1,...])    执行协程方法,[]里是方法的参数。返回协程是否在运行,以及自定义的返回值。
running()    返回正在运行的协程句柄,在主线程调用返回nil。
status(co)    返回协程的状态,输入为协程句柄。
返回值:
"running"(运行中)
"suspended"(暂停)
"normal"(活动但未启用)
“dead”(死的)
wrap(f)    创建一个协程,但是返回的不是协程的句柄,而是调用协程方法的方法。
yield(...)    暂停协程,传递的参数为额外的返回值。
 

co= coroutine.create(
		function (x,y)
			local temp=10;
			print("function",coroutine.status( co ));
			print("coroutine section",x,y,temp);
			local tempvar1=coroutine.yield( x+1,y+1 );
			print("coroutine section2",x,y,temp);
			print(coroutine.status(co))
		end
	)
	
	print(coroutine.status(co));
	print("main" ,coroutine.resume( co,3,2));
	print(coroutine.status( co ));
	print("main",coroutine.resume(co ,12,14 ));

    

wrap:

local func = function() 
		coroutine.yield(1) 
		coroutine.yield(2)
		coroutine.yield(3)
		coroutine.yield(4)
		coroutine.yield(5)
	end

	local fun = coroutine.wrap (func)

	for i = 1, 10 do
		print(fun())
	end

1:第六行显示的是空,因为func方法里实际上执行了六次,第六次的返回值为nil。

2:最后一行显示报错信息,因为协程挂了,所以不能再执行

猜你喜欢

转载自blog.csdn.net/u012909508/article/details/83382450