魏长东

weichangdong

lua的协程学习

有些知识当时看懂了,但是过一阵子发现看半天又看不懂了,真是不知所谓。

可能是学习没有复习的原因吧。

Lua所支持的协程全称被称作协同式多线程,协同程序与线程差不多,也就是一条执行序列,拥有自己独立的栈,局部变量和指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。线程与协同程序的主要区别在于,一个具有多线程的程序可以同时运行几个线程,而协同程序却需要彼此协作地运行。就是说,一个具有多个协同程序的程序在任何时刻只能运行一个协同程序,并且正在运行的协同程序只会在其显示地挂起时,它的执行才会暂停。

我的理解。就是暂停程序,等下一次调用,然后从上次停下的地方继续执行。

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

co = coroutine.create(function ( a, b )
    print("co-body-1", a, b)
    local r = foo(a + 1)
    print("co-body-2", r)
	local a=a+1
    local r, s = coroutine.yield(a + b, a - b)
    print("co-body-3", r, s)
    return "a="..a,"b="..b, "end"
end)

print("main-1", coroutine.resume(co, 1, 10))
print("main-2", coroutine.resume(co, "r"))
print("main-3", coroutine.resume(co, "y"))
print("main-4", coroutine.resume(co, "p"))

print("==============\n")
local co2 = coroutine.create(function ()
for i=1,10 do
print("co2", i)
coroutine.yield()
end
end)
coroutine.resume(co2)
coroutine.resume(co2)
coroutine.resume(co2)
coroutine.resume(co2)
coroutine.resume(co2)

执行结果

co-body-1	1	10
foo	2
main-1	true	4
co-body-2	r
main-2	true	12	-8
co-body-3	y	nil
main-3	true	a=2	b=10	end
main-4	false	cannot resume dead coroutine
==============

co2	1
co2	2
co2	3
co2	4
co2	5