協程類似與執行緒,但與執行緒不同,執行緒可以多個執行緒同時執行,但是協程需要彼此協作的執行,乙個具有多個協程的程式任意時刻只能執行乙個協程,並且在執行協程只會在其顯示地要求掛起時,才會暫停。
乙個協程有4種不同的狀態:掛起,執行,死亡和正常。建立乙個協程時,他處於掛起狀態。
coroutine.status(co)檢查協程的狀態
coroutine.resume(co)用於啟動或再次啟動乙個協程的執行,將其由掛起改為執行。
coroutine.yield()用於將乙個執行中的協同程式掛起,而且之後可以用resume再執行
當乙個協程a喚醒另乙個協程b時,協程a即不是掛起狀態,也不是執行狀態,此時處於正常狀態。
lua的協程可以通過一對resume yield來交換資料。
co = coroutine.create(function(alb,c)
print("co",alb,c)
end )
coroutine.resume(co,1,2,3)--->co 1 2 3
co = coroutine.create(function(a,b)
coroutine.yield(a+b,a-b)
end )
print(coroutine.resume(co,20,10)) ---->true 30 10
lua提供的是非對稱的協同程式,用兩個函式來控制協同程式的執行。
1 協程可以用來實現迭代器
常規實現:
function p(a,n)
n = n or #a
if n <= 1 then
printresult(a)
else
for i =1 , n do
a[n],a[i] = a[i],a[n]
p(a,n-1)
a[n],a[i]=a[i],a[n]
endend
end協程實現
function permutations(a)
return coroutine.wrap(function() p(a) end)
endfunction p(a,n)
n = n or #a
if n<= 1 then
coroutine.yield(a)
else
for i =1 , n do
a[n],a[i] = a[i],a[n]
p(a,n-1)
a[n],a[i]=a[i],a[n]
endend
endcoroutine.wrap建立乙個新的協程,不同於create,wrap並不返回協程本身,而是返回乙個函式。
協程是非搶占式的,因此當有乙個執行緒被阻塞了,其他的執行緒都會被阻塞,這是不可以接受的。
socket.select(connections) --->將所有超時的連線收集到乙個connections的table中,receive會將超時的連線通過yield傳遞,如果所有的連線都超時,排程程式就呼叫select來等待這些連線的狀態發生變化。
endend
endend
lua協同程式
co coroutine.create function a print co a end coroutine.resume co,1,2,3 co 1 co coroutine.create function a,b coroutine.yield a b,a b end 在resume呼叫的返回...
lua協同程式理解
參考 協程和多執行緒下的執行緒類似 有自己的堆疊,自己的區域性變數,有自己的指令指標,但是和其他協程程式共享全域性變數等資訊。執行緒和協程的主要不同在於 多處理器的情況下,概念上來說多執行緒是同時執行多個執行緒,而協程是通過協作來完成,任何時刻只有乙個協程程式在執行。並且這個在執行的協程只有明確被要...
Lua學習筆記之協同程式
lua學習筆記之協同程式 1 協同程式與多執行緒情況下的執行緒比較類似,有自己的堆疊。自己的區域性變數,有自己的指令指標,但是和其他協同程式共享全域性變數等很多資訊。執行緒和協同程式的主要不同在於 在多核處理器情況下,多執行緒程式同時執行多個執行緒,而協同程式是通過協作來完成,在任意指定時刻只有乙個...