本系列文章是 DolphinScheduler 由淺入深的教程,涵蓋搭建、二開迭代、核心原理解讀、運維和管理等一系列內容。適用於想對 DolphinScheduler瞭解或想要加深理解的讀者。 推薦閱讀: 海豚調度監控:使用圖關係解決核心鏈路告警問題,減輕任務運維負擔,用戶五星好評! 海豚調度 ...
4.2 迭代器
Lua提供了兩個迭代器pairs(table) 與 ipairs(table)。這兩個迭代器通常會應用於泛型for迴圈中,用於遍歷指定的table。這兩個迭代器的不同是:
- ipairs(table):僅會迭代指定table中的數組元素。
- pairs(table) :會迭代整個table元素,無論是數組元素,還是key-value。
4.3 模塊
模塊是Lua中特有的一種數據結構。從 Lua 5.1 開始,Lua加入了標準的模塊管理機制,可以把一些公用的代碼放在一個文件里,以 API 介面的形式在其他地方調用,有利於代碼的重用和降低代碼耦合度。
模塊主要由 table 組成。在 table 中 添加相應的變數、函數,最後文件返回該 table 即可。如果其它文件中需要使用該模塊,只需通過 require 將該模塊導入即可。
4.4 元表與元方法
元表,即 Lua 中普通 table 的元數據表,而元方法則是元表中定義的普通表的預設行為。 Lua 中的每個普通 table 都為其定義一個元表,用於擴展該普通 table 的行為功能。例如,對於 table 與數值相加的行為, Lua 中是沒有定義的,但用戶可通過 為其指定元表來擴展這種行為;再如,用戶訪問不存在的 table 元素, Lua 預設返回的是 nil,但用戶可能並不知道發生了什麼。此時可以通過為該 table 指定元素來擴展該行為:給用戶提示信息,並返回用戶指定的值。
(1)重要函數
元表中有兩個重要函數:
- setmetatable(table,metatable)::將metatable指定為普通table的元表。
- getmetatable(table):獲取指定普通表 table 的元表。
(2)__index 元方法
當用戶在對 table 進行讀取訪問時,如果訪問的數組索引或key 不存在,那麼系統就會自動調用元表的 __index 元方法。該重寫的方法可以是一個函數,也可以是另一個表。如果重寫的__index 元方法是函數,且有返回值,則直接返回;如果沒有返回值,則返回nul。
(3)__newindex元方法
當用戶為 table 中一個不存在的索引或key賦值時,就會自動調用元表的__newindex 元方法。該重寫的方法可以是一個函數,也可以是另一個表。如果重寫的__newindex元方法是函數,且有返回值,則直接返回;如果沒有,則返回nil。
(4)運算符元方法
如果要為一個表擴展加號(+)、減號(-)、等於(==)、小於(<)等運算功能,則可重寫相應的元方法。
例如,如果要為一個table擴展加號(+)運算功能,則可以重寫該table元表的__add元方法,而具體的運算規則,則是定義在該重寫的元方法中的。這樣,當一個table在進行加法(+)運算時,就會自動調用其元表的__add元方法。
類似於加法操作的其它操作,Lua中還有:
元方法 | 說明 | 元方法 | 說明 |
__add | 加法,+ | __band | 按位與,& |
__sub | 減法,- | __bor | 按位或,| |
__mul | 乘法,* | __bxor | 按位異或,~ |
__div | 除法,/ | __bnot | 按位非,~ |
__mod | 取模,% | __shl | 按位左移,<< |
__pow | 次冪,^ | __shr | 按位右移,>> |
__unm | 取反,- | __eq | 等於,== |
__idiv | 取整除法,// | __it | 小於,< |
__concat | 字元串連接,... | __lt | 大於,> |
__len | 字元串長度,# |
(5)__tostring 元方法
直接輸出一個table,其輸出的內容為類型與table的存放地址。如果想讓其輸出table中的內容,可重寫__tostring元方法。
(6)__call元方法
當將一個table以函數形式來使用時,系統會自動調用重寫的__call元方法。該用法主要時可以簡化對table的相關操作,將對table的操作與函數直接結合。
(7)元表單獨定義
為了便於管理和復用,可以將元素單獨定義為一個文件。該文件中僅可定義一個元表,且一般文件名與元表名稱相同。
若一個文件要使用其它文件中定義的元表,只需使用 require"元表文件名“ 即可將元表導入使用。
如果用戶想擴展該元表而又不想修改元表文件,則可在用戶自己文件中重寫其相應功能的元方法即可。
5.面向對象
Lua 中沒有類的概念,但通過table、function 與元表可以模擬和構造出具有類這樣功能的結構。
(1)簡單對象的創建
Lua 中通過table 與 function可以創建出一個簡單Lua對象:table為Lua對象賦予屬性,通過function為Lua對象賦予行為,即方法。
(2)類的創建
Lua 中使用table 、function與元表可以定義出類:使用一個表作為基礎類,使用一個function作為該基礎類的new()方法。在該new()方法中創建出一個空表,再為該空表指定一個元表。該元表重寫__index元方法,且將基礎表指定為重寫的__index元方法。由於new()中的表是空表,所以用戶訪問的所有key都會從基礎類(表)中查找。
6.協同線程與協同函數
(1)協同線程
Lua 中有一種特殊的線程,稱為coroutine,協同線程,簡稱協程。其可以再運行時暫停執行,然後轉去執行其它線程,然後還可以返回再繼續執行沒有執行完畢的內容。即可以”走走停停,停停再走走“。
協同線程也稱為協作多線程,在Lua中表示獨立的執行線程。任意時刻只會有一個協程執行,而不會出現多個協程同時執行的情況。
協同線程的類型為thread,其啟動、暫停、重啟等,都需要通過函數來控制。下表是用於控制協同線程的基本方法。
方法 | 描述 |
create(function) | 創建一個協同線程實例,即返回的是thread類型。參數是一個function。其需要通過resume()來啟動協同線程的執行。 |
resume(thread,...) | 啟動指定的協同線程的執行,使其 從開始處或前面掛起處開始執行。可以向create()的內置函數傳遞相應的參數。如果內置函數具有返回值,resume()會全部接收並返回。 |
running() | 返回正在運行的協同線程實例,即thread類型值。 |
yield() | 掛起協同線程,並將協同線程設置為掛起狀態。resume()可從掛起處重啟被掛起的協同線程。 |
status(thread) | 查看協同線程的狀態。狀態有三種:運行態running,掛起態suspended,消亡態dead。 |
colse() | 關閉協同線程 |
wrap(function) | 創建一個協同線程,返回的是function類型。一旦調用該函數就會創建並執行一個協同線程實例。 |
示例 1 ,無返回值
示例 2 ,有返回值
(2)協同函數
協同線程可以單獨創建執行,也可以通過協同函數的調用啟動執行。使用coroutine的wrap()函數創建的就是協同函數,其類型為function。
由於協同函數的本質就是函數,所以,協同函數的調用方式就是標準的函數調用方式。只不過,協同函數的調用會啟動其內置的協同線程。
示例如下:
也可以通過resume的方式開始掛起的協程。
學習筆記--參閱特別聲明
1.【Redis視頻從入門到高級】
【https://www.bilibili.com/video/BV1U24y1y7jF?p=11&vd_source=0e347fbc6c2b049143afaa5a15abfc1c】