多线程 就像是实时对战游戏,同一时间两名玩家可以同时运动。协程 就像是棋牌游戏,表面上是两个同时在玩,实际上只是两个人交替执行,同一时间只有一名玩家可以活动。所以协程不会存在死锁等多线程特有的问题。协程可以通过顺序流的代码进行模拟,就像自己跟自己下棋,先走一步,然后坐到对面走一步,再坐回来…多线程如果底层不支持的话是没法模拟的。所以协程更像是一种高级的语法糖,把一个人的步骤分到两个人身上执行,这样使代码看起来更加条理。
-- 创建 coroutine
co2 = coroutine.create(
function()
for i=1,3 do
ret = coroutine.yield() -- 暂停
print(ret)
end
end
)
coroutine.resume(co2)
coroutine.resume(co2, 11) --11
coroutine.resume(co2, 22) --22
-- 查看状态
print(coroutine.status(co2))
-- 查看线程号
print(coroutine.running())
-- 执行顺序
co = coroutine.wrap(
function(i)
print(i); --2
a = coroutine.yield() --3
print(a); --5
b = coroutine.yield() --6
print(b);
end
)
co('a') --1
co('b') --4
co('c') --7
--参数传递过程
co = coroutine.create(
function()
for i=1,3 do
y = coroutine.yield("让出 "..i)--2 6 10
print(y)-- 5 9
end
end
)
for i=1,3 do
_, r = coroutine.resume(co, "接管 "..i)--1 4 8
print(r) --3 7 11
end
--[[
让出1
接管2
让出2
接管3
让出3
]]