Lua之协同程序coroutine代码实例

do
	--create coroutine table
	--coroutine state: suspended, running, dead, normal
	--when create the coroutine, the status is suspended, After calling it, the status is dead
	--get the coroutine status by the way coroutine.status
	local coA = 0;
	local coB = 0;

	function createCoroutineA()

		coA = coroutine.create(
										function()
											--for i = 0, 10 do
												print("coA: ", 0);
												print("coB status: ", coroutine.status(coB)); --normal status
												print("coA status: ", coroutine.status(coA));
												print("coA coroutine next status");
												--coroutine.yield();--the current coroutine is suspended
											--end
										end
									);
		print("From coA to resume coB");
	end

	function createCoroutineB()

		coB = coroutine.create(
										function()
											--for i = 0, 10 do
												print("coB: ", 0);
												print("coA status: ", coroutine.status(coA));
												coroutine.resume(coA); --when resume coA, the coB will suspended, calling coB ,the coA status is
												--suspended and dead, this time will continue to execute the next code
												print("coB status: ", coroutine.status(coB));
												print("coB coroutine next status");
												--coroutine.yield();
											--end
										end
									);
		print("From coB to resume coA");
	end

	--display the coA and coB status
	createCoroutineA();
	print(coroutine.status(coA));

	createCoroutineB();
	print(coroutine.status(coB));

	coroutine.resume(coB);
	print(coroutine.resume(coB)); --if the coroutine is dead ,the resume will resume false, and can't resume the dead coroutine
	--print("coA status: ", coroutine.status(coA));
	--print("coB status: ", coroutine.status(coB));
end

注:
resume得到返回值,
如果有对应的yield在wait resume,那么yield的参数作为resum的返回值,第一个返回值表示coroutine没有错误,后面的返回值个数及其值视yeild参数而定。
如果没有yield在wait,那么返回值是对应函数的返回值,:true,* * *

do
	--create coroutine table
	--coroutine state: suspended, running, dead, normal
	--when create the coroutine, the status is suspended, After calling it, the status is dead
	--get the coroutine status by the way coroutine.status
	local coA = 0;
	local coB = 0;

	function createCoroutineA()

		coA = coroutine.create(
										function(paramA, paramB)
											--for i = 0, 10 do
												print("coA: ", 0);
												coroutine.yield(paramA, paramB);--the current coroutine is suspended
											--end
											return 100, 200;
										end
									);
		print("From coA to resume coB");
	end

	function createCoroutineB()

		coB = coroutine.create(
										function()
											--for i = 0, 10 do
												print("coB: ", 0);
												print("coA status: ", coroutine.status(coA));
												coroutine.resume(coA); --when resume coA, the coB will suspended, calling coB ,the coA status is
												--suspended and dead, this time will continue to execute the next code
												print("coB status: ", coroutine.status(coB));
												print("coB coroutine next status");
												--coroutine.yield();
											--end
										end
									);
		print("From coB to resume coA");
	end
	createCoroutineA();
	--if not yield is waiting ,the return values that the main function return as the results of the resume
	--or the return as the yield params
	print( coroutine.resume(coA, 10, 20));--OutPut:true, 10, 20

end
(0)

相关推荐

  • Lua协同程序函数coroutine使用实例

    协程是协同程序的简称,顾名思义,就是协同工作的程序.协程拥有自己独立的桟.局部变量和PC计数器,同时又与其他协同程序共享全局变量和其他大部分东西: 协程与线程的主要区别在于,一个多线程程序可以同时运行几个线程(并发执行.抢占),而协同程序却需要彼此协作地运行,即一个多协程程序在任意时刻只能运行一个协程,并且正在执行的协程只会在其显式地要求挂起(suspend)时,它的执行才会暂停(无抢占.无并发). Lua中所有与协程相关的函数都在coroutine(一个table)中: 函数create用于创

  • Lua协同程序(COROUTINE)运行步骤分解

    这是一段分析 lua 协程(协同程序,coroutine)的代码,来自 Lua reference manual interface (略有修改): 复制代码 代码如下: function foo (a)     print("foo", a)     return coroutine.yield(2*a) end co = coroutine.create(function (a,b)    print("co-body1", a, b)    local r =

  • Lua之协同程序coroutine代码实例

    do --create coroutine table --coroutine state: suspended, running, dead, normal --when create the coroutine, the status is suspended, After calling it, the status is dead --get the coroutine status by the way coroutine.status local coA = 0; local coB

  • Lua协同程序coroutine的简介及优缺点

    什么是协同(coroutine)? Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈,独立的局部变量,独立的指令指针,同时又与其它协同程序共享全局变量和其它大部分东西. 协同是非常强大的功能,但是用起来也很复杂. 线程和协同程序区别 协程是编译器级别的,线程是操作系统级别的,在多处理器情况下,多线程程序同时运行多个线程:而协同程序是通过协作来完成,在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只在必要时才会被挂起.这样Lua的协程就不能利用现在多核技术了.

  • Lua中的类编程代码实例

    Lua的类有点像javascript,但是更简明灵活,table即对象,对象就是类.Metatables比起ruby里的MetaClass更加好用,缺点是实例化和继承的代码有点多, 不像ruby里的"<"和"<<",继承链就是查找方法时的方法链. Account={ test1=function(a) print("Account test1") end } Account.test2=function(a) print(&qu

  • 拳皇(Java简单的小程序)代码实例

    刚开始学习Java,看完老九君的视频根据他的内容敲的代码,感觉还挺有成就感的,毕竟刚学习Java. package helloasd;import java.util.*; public class hellojava { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("输入名称: "); //用户自己输入名字 String userna

  • 用Python写一个模拟qq聊天小程序的代码实例

    Python 超简单的聊天程序 客户端: import socket, sys host = '10.248.27.23' # host = raw_input("Plz imput destination IP:") # data = raw_input("Plz imput what you want to submit:") port = 51423 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) tr

  • Lua中遍历文件操作代码实例

    写的一个关于遍历文件的程序段  记录一下咯 --[[检查所有.txt文件 比如A.txt中第一行规定有20列,但是在X行中多输入一个Tab,则输出:A表的X行填写不规范,行末有多余填写 ]] getinfo = io.popen('dir ..//file /b /s') all = getinfo:read('*all') local filenameList = io.open("filename.txt", "wb") filenameList:write(&

  • Lua中的协同程序详解

    前言 协同程序与线程差不多,也就是一条执行序列,拥有自己独立的栈.局部变量和指令指针,同时又与其它协同程序共享全局变量和其它大部分东西.从概念上讲,线程与协同程序的主要区别在于,一个具有多个线程的程序可以同时运行几个线程,而协同程序却需要彼此协作的运行.就是说,一个具有多个协同程序的程序在任意时刻只能运行一个协同程序,并且正在运行的协同程序只会在其显式地要求挂起时,它的执行才会暂停. 协同程序基础 Lua将所有关于协同程序的函数放置在一个名为"coroutine"的table中.函数c

  • Lua中的协同程序探究

    哎,周五晚上我都还这么努力看书,真是好孩子.(小若:不想吐槽了) 其实我都准备玩游戏看电影去的了,但是这书就摆在桌子上,而且正对着我,就想着,扫两眼吧. 结果一扫就不对劲了,因为这内容有点绕,有点小混乱,如果我现在不记录下来的话,下周一可能又要重新看一次了.   好吧,今天我们来聊聊协同程序. 1.什么是协同程序(coroutinue) 大家都知道线程吧?都知道多线程吧?协同程序就和这线程差不多,但是又有比较明显的区别. 多个协同程序在任意时刻只能执行一个,虽然线程在某种意义上也是这样,但这不是

随机推荐