_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"))