Programming in Lua 協同程式

2021-10-24 21:56:55 字數 2308 閱讀 4907

看了好幾次協同程式都始終沒能搞懂其中resume是如何與yield進行資料交流的,今天終於看懂了,讓我們從頭說起

coroutine.create( )

建立coroutine,返回coroutine, 引數是乙個函式,當和resume配合使用的時候就喚醒函式呼叫

coroutine.resume( )

重啟coroutine,和create配合使用

coroutine.yield()

掛起coroutine,將coroutine設定為掛起狀態,這個和resume配合使用能有很多有用的效果

coroutine.status( )

檢視coroutine的狀態

coroutine.wrap()

建立coroutine,返回乙個函式,一旦你呼叫這個函式,就進入coroutine,和create功能重複

coroutine.running()

返回正在跑的coroutine,乙個coroutine就是乙個執行緒,當使用running的時候,就是返回乙個corouting的執行緒號

function foo (a)

print("foo 函式輸出", a)

return coroutine.yield(2 * a) -- 返回 2*a 的值

end

co = coroutine.create(function (a , b)

print("第一次協同程式執行輸出", a, b) -- co-body 1 10

local r = foo(a + 1)

print("第二次協同程式執行輸出", r)

local r, s = coroutine.yield(a + b, a - b) -- a,b的值為第一次呼叫協同程式時傳入

print("第三次協同程式執行輸出", r, s)

return b, "結束協同程式" -- b的值為第二次呼叫協同程式時傳入

end)

print("main", coroutine.resume(co, 1, 10)) -- true, 4

print("--分割線----")

print("main", coroutine.resume(co, "r")) -- true 11 -9

print("---分割線---")

print("main", coroutine.resume(co, "x", "y")) -- true 10 end

print("---分割線---")

print("main", coroutine.resume(co, "x", "y")) -- cannot resume dead coroutine

print("---分割線---")

上面**的輸出如下

第一次協同程式執行輸出    1    10

foo 函式輸出 2

main true 4

--分割線----

第二次協同程式執行輸出 r

main true 11 -9

---分割線---

第三次協同程式執行輸出 x y

main true 10 結束協同程式

---分割線---

main false cannot resume dead coroutine

---分割線---

第乙個分割線之前的內容很好理解,resume呼叫時,引數傳遞分兩種情況,一種是第一次,把引數傳遞給協程主程式,之後的resume就把引數傳遞給yield函式,繼續協程函式執行。

首先第一次傳遞引數給主程式,呼叫foo 輸出2,遇到yield,協程返回狀態和yield的引數 main true 4。

然後第二次resume,傳遞引數是「r」,這時候協程從上次yield的地方開始繼續執行,也就是第乙個local r的賦值,此時傳遞引數是字串「r」,那麼yield的引數就是「r」,local r的值就被賦值成了字串。之後的x,y也同理

最後函式執行結束返回return之後,這時再去呼叫resume,因為程式已經結束了,所以是dead狀態,返回false

這段程式的關鍵就在於,第一次之後每次resume的引數都作為上次掛起時候yield的返回值,可以在程式內繼續賦值,相當於傳遞引數,而yield本身相當於是暫時性的return語句,yield本身的引數用來做resume函式的返回值,yield(a,b)也就相當於是return a,b

這就是之前很繞的一段話:resume的引數是yield的返回值,yield的引數是resume的返回值。真的太繞了。。。

programming in lua 第五章筆記

當乙個函式只有乙個引數,而且這個引數的型別是字串或者table,那麼函式的 可以省略 函式的引數是乙個local變數 lua函式可以返回多個返回值 s,e string.find hello lua users lua print s,e 7 9 可以強制函式只返回1個返回值 print foo0 ...

programming in lua 第一章筆記

1.命令列執行lua 檔案 lua hello.lua 2.命令列輸入lua會獲得lua版本資訊 並進入互動模式 lua 退出命令列模式 ctrl d unix,ctrl z windows 或者呼叫os.exit 可以使用 i來讓lua先進入互動模式 再執行lua檔案 lua i test.lua...

協同辦公協同的到底是什麼?

偶然間想到這個問題,於是便試著去回答。從字面理解,協同就是共同協作,也就是說協同辦公作用的物件是兩個或者多個個體,這些物件共同處理完成某項工作或某個任務。可仔細一想不對啊,很多的工作是不需要多個人去合作完成的,比如說我,我是文案人員,所以我只需要把東西寫好就可以了,根本不需要跟別人合作嘛。那協同辦公...