GopherLua基礎(chǔ)入門

Go的內(nèi)嵌腳本語言有很多牲平,Python語言就是一例。Python有豐富的用戶群體域滥,強大的第三方庫纵柿,廣泛的開源工具支持,Go的最佳伴侶應(yīng)該是Python启绰,可是Python的一些不足之處卻讓Go感到為難昂儒。最好用的開源的go-python庫是全局單例的Python解釋器,對于并發(fā)能力比較出色的Go語言來說委可,萬惡的GIL會讓Go運行時降級為單線程渊跋,很容易就成了運行的瓶頸。

看來Python這條路是走不下去了着倾,幸好拾酝,還有Lua。

Lua作為專業(yè)的內(nèi)置腳本語言卡者,它是單線程的運行的蒿囤,沒有操作系統(tǒng)級別的多線程,同一個進程可以運行多個Lua解釋器實例崇决,數(shù)據(jù)完全獨立材诽,互不干擾镶摘。它的學(xué)習(xí)成本比Python還要低廉,普通用戶大約花個30分鐘就可以把Lua語言的基本特性都學(xué)完了岳守。

Lua目前最好的golang開源項目是日本人實現(xiàn)的凄敢,叫GopherLua。

接下來我們逐步研究一下GopherLua如何使用湿痢,首先寫一個HelloWorld

輸出結(jié)果

注意我們使用NewState得到一個獨立的Lua解釋器實例涝缝,后續(xù)的所有操作都是基于這個實例內(nèi)部進行的,全局狀態(tài)限于L對象內(nèi)部譬重,沒有進程級別的全局狀態(tài)拒逮。如果要得到多個解釋器實例,使用NewState多創(chuàng)建幾個就行臀规。

也許你會想到golang有如此多的goroutine滩援,難道要每個goroutine都開一個lua解釋器實例么,如果這樣塔嬉,內(nèi)存肯定是要被撐爆的玩徊。

GopherLua考慮到了這點,它使用解釋器實例池解決了這個問題谨究。當(dāng)用戶想要使用Lua解釋器時恩袱,從池中取出一個,用完了再還回去胶哲。因為同一個解釋器可能要被多個協(xié)程使用畔塔,雖然不是同一時間被多個協(xié)程使用,要注意全局狀態(tài)不要相互干擾鸯屿。

下面我們使用GopherLua調(diào)用一個lua模塊

斐波那契數(shù)列使用獨立的lua腳本實現(xiàn)澈吨,golang使用DoFile加載腳本,然后使用CallByParam調(diào)用腳本中的fib全局函數(shù)寄摆,最后獲取返回結(jié)果打印輸出谅辣。

GopherLua的函數(shù)調(diào)用是通過堆棧來進行的,調(diào)用前將參數(shù)壓棧冰肴,完事后將結(jié)果放入堆棧中屈藐,調(diào)用方在堆棧頂部拿結(jié)果。

接下來我們將lua面向?qū)ο蟮睦臃g成對應(yīng)的GopherLua代碼熙尉。也就是使用GopherLua提供的API一步一步組裝成復(fù)雜的lua對象定義及其實現(xiàn)联逻。

上面是一個簡單的Counter對象,提供incr和get兩個操作進行自增和獲取當(dāng)前值检痰。如果你不了解lua的面向?qū)ο筇匦园椋埶阉饕幌翷ua菜鳥教程進行閱讀

我們來把上面的lua代碼翻譯成一個等價的GopherLua代碼

換成了Go代碼就比上面的lua代碼復(fù)雜太多了,看起來也遠不及l(fā)ua直接铅歼。特別是返回值不是返回值公壤,而是返回值的個數(shù)换可,返回值要往棧里壓。還有參數(shù)也不是直接拿到的厦幅,而要從棧里面挨個拿沾鳄。函數(shù)調(diào)用在形式上像極了匯編語言。

GopherLua除了可以滿足基本的lua需要确憨,還將Go語言特有的高級設(shè)計直接移植到lua環(huán)境中译荞,使得內(nèi)嵌的腳本也具備了一些高級的特性

可以使用context.WithTimeout對執(zhí)行的lua腳本進行超時控制

可以使用context.WithCancel打斷正在執(zhí)行的lua腳本

多個lua解釋器實例之間還可以通過channel共享數(shù)據(jù)

支持多路復(fù)用選擇器select

使用Lua作為內(nèi)嵌腳本的另外一個重要優(yōu)勢在于Lua非常輕量級,占用內(nèi)存極小休弃。接下來我們使用下面的腳本來測試測試單個Lua解釋器實例占用的內(nèi)存大小吞歼。

上面的代碼開啟了10000個lua解釋器實例,每個解釋器實例調(diào)用一次斐波拉契函數(shù)輸出結(jié)果塔猾。然后在退出之前休眠100s便于我們使用top命令觀察進程的內(nèi)存占用篙骡。

觀察發(fā)現(xiàn)在筆者的mac電腦上,整個進程占據(jù)了大約1.7G左右的內(nèi)存丈甸。平攤下來大約每個解釋器實例占據(jù)170k左右的內(nèi)存空間糯俗,相比Python動輒幾個M大小的空間來說,這已經(jīng)非常節(jié)約了老虫,但實際上lua在節(jié)約內(nèi)存的道路上可以走的更遠叶骨。GopherLua提供了對Lua運行時進行裁剪的功能,這能使得它占用的內(nèi)存更小祈匙。

當(dāng)內(nèi)嵌腳本要被終端用戶使用時,需要考慮一些安全問題天揖。比如用戶編寫的腳本代碼使用了lua提供的庫函數(shù)訪問了不該訪問的文件夺欲,或者調(diào)用了一些不該調(diào)用的系統(tǒng)模塊。這些不良行為都會給系統(tǒng)帶來威脅今膊,需要進行約束些阅。

GopherLua可以創(chuàng)建一個非常干凈的Lua解釋器實例,不加載任何系統(tǒng)模塊斑唬。然后由程序員自己提供的模塊注冊進去市埋,給內(nèi)嵌腳本提供一個安全的沙箱運行環(huán)境。

閱讀相關(guān)文章恕刘,關(guān)注微信公眾號/知乎專欄/頭條號【碼洞】

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末缤谎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子褐着,更是在濱河造成了極大的恐慌坷澡,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件含蓉,死亡現(xiàn)場離奇詭異频敛,居然都是意外死亡项郊,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門斟赚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來着降,“玉大人,你說我怎么就攤上這事拗军∪蛋” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵食绿,是天一觀的道長侈咕。 經(jīng)常有香客問我,道長器紧,這世上最難降的妖魔是什么耀销? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮铲汪,結(jié)果婚禮上熊尉,老公的妹妹穿的比我還像新娘。我一直安慰自己掌腰,他們只是感情好狰住,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著齿梁,像睡著了一般催植。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上勺择,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天创南,我揣著相機與錄音,去河邊找鬼省核。 笑死稿辙,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的气忠。 我是一名探鬼主播邻储,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼旧噪!你這毒婦竟也來了吨娜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤舌菜,失蹤者是張志新(化名)和其女友劉穎萌壳,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡袱瓮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年缤骨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尺借。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡绊起,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出燎斩,到底是詐尸還是另有隱情虱歪,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布栅表,位于F島的核電站笋鄙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏怪瓶。R本人自食惡果不足惜萧落,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望洗贰。 院中可真熱鬧找岖,春花似錦、人聲如沸敛滋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绎晃。三九已至蜜唾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間箕昭,已是汗流浹背灵妨。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留落竹,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓货抄,卻偏偏與公主長得像述召,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蟹地,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容