lua 协程调用顺序

_G.id = _G.id or 0
function getId()
	_G.id = _G.id + 1
	return _G.id
end

_G.coroutineList = _G.coroutineList or {}

function fun1(id,oneResumeparam)
	local coroutine = _G.coroutineList[id]
	print(coroutine[1],id..oneResumeparam)
	
end


--1.创建协程
function createCoroutine(param1,param2)
	local id = getId()
	local coId = coroutine.create(function (param)  --param = param1
		print(" start coroutine  "..param)
		fun1(id,param)
		local twoResumeParam = coroutine.yield() --3.挂起协程
		print(twoResumeParam)  -- twoResumeParam == id.."333"   or   id.."666"

		return param,twoResumeParam,"end"
	end)

	_G.coroutineList[id] = {coId}

	 print("startCoroutineWork", coroutine.resume(coId, param1)) --2.唤醒协程 开始执行 coroutine.create 的 function  
	 return id
end

local id = createCoroutine("111","222")
-- print(id)
print(coroutine.resume(_G.coroutineList[id][1],id.."333"))  --再次唤醒时,remume第一个参数后的参数会被当做yield的返回值
id = createCoroutine("444",'555')
print(coroutine.resume(_G.coroutineList[id][1],id.."666"))

下面是云风协程的案例 可以参考

-- 打印协程1和协程2的状态
function status()
    print("co1's status :"..coroutine.status(co1).." ,co2's status: "..coroutine.status(co2))
end

-- 协程1
co1 = coroutine.create(function ( a )
    print("co1 arg is :"..a)
    status()

	-- 唤醒协程2
	local stat,rere = coroutine.resume(co2,"2")
    print("111 co2 resume's return is "..rere)
    status()

	-- 再次唤醒协程2
	local stat2,rere2 = coroutine.resume(co2,"4")
    print("222 co2 resume's return is "..rere2)
    local arg = coroutine.yield("6")
end)

-- 协程2
co2 = coroutine.create(function ( a )
    print("co2 arg is :"..a)
    status()
    local rey = coroutine.yield("3")
    print("co2 yeild's return is " .. rey)
    status()
    coroutine.yield("5")
end)

--主线程执行协程co1,传入字符串“main thread arg”
stat,mainre = coroutine.resume(co1,"main thread arg")
status()
print("last return is "..mainre)


function foo(a)
	print("foo", a)
	return coroutine.yield(2 * a)
end

co = coroutine.create(function ( a, b )
	print("co-body", a, b)
	local r = foo(a + 1)
	print("co-body", r)

	local r, s = coroutine.yield(a + b, a - b)
	print("co-body", r, s)
	return b, "end"
end)

print("main", coroutine.resume(co, 1, 10))
print("main", coroutine.resume(co, "r"))
print("main", coroutine.resume(co, "x", "y"))
print("main", coroutine.resume(co, "x", "y"))
发布了43 篇原创文章 · 获赞 1 · 访问量 2301

猜你喜欢

转载自blog.csdn.net/lpl312905509/article/details/104040822