初識lua協同程式

2021-08-15 17:28:04 字數 2785 閱讀 4476

協程類似與執行緒,但與執行緒不同,執行緒可以多個執行緒同時執行,但是協程需要彼此協作的執行,乙個具有多個協程的程式任意時刻只能執行乙個協程,並且在執行協程只會在其顯示地要求掛起時,才會暫停。

乙個協程有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 協同程式與多執行緒情況下的執行緒比較類似,有自己的堆疊。自己的區域性變數,有自己的指令指標,但是和其他協同程式共享全域性變數等很多資訊。執行緒和協同程式的主要不同在於 在多核處理器情況下,多執行緒程式同時執行多個執行緒,而協同程式是通過協作來完成,在任意指定時刻只有乙個...