1. 首頁 > 汽車知識網 > 汽車知識

    golang菜鳥教程,python與go混合編程

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

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

    Lua作為專業的內置腳本語言,它是單線程的運行的,沒有操作系統級別的多線程,同一個進程可以運行多個Lua解釋器實例,數據完全獨立,互不干擾。它的學習成本比Python還要低廉,普通用戶大約花個30分鐘就可以把Lua語言的基本特性都學完了。

    Lua目前最好的golang開源項目是日本人實現的,叫GopherLua。

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

    輸出結果

    靜態編譯后只生成單個文件。實現小型和工具型程序不需依賴,易于分享。直接編譯為exe等可執行文件,不用像PyQt、Electron那樣再打包。跨平臺編譯能力,同時支持多個跨平臺庫。并發優化,協程支持,開發多線程GUI程序,比Python效率。

    注意我們使用NewState得到一個獨立的Lua解釋器實例,后續的所有操作都是基于這個實例內部進行的,全局狀態限于L對象內部,沒有進程級別的全局狀態。如果要得到多個解釋器實例,使用NewState多創建幾個就行。

    也許你會想到golang有如此多的goroutine,難道要每個goroutine都開一個lua解釋器實例么,python與go混合編程,如果這樣,內存肯定是要被撐爆的。

    下面我們使用GopherLua調用一個lua模塊

    golang菜鳥教程

    接下來我們將lua面向對象的例子翻譯成對應的GopherLua代碼。也就是使用GopherLua提供的API一步一步組裝成復雜的lua對象定義及其實現。

    上面是一個簡單的Counter對象,提供incr和get兩個操作進行自增和獲取當前值。如果你不了解lua的面向對象特性,請搜索一下Lua菜鳥教程進行閱讀

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

    換成了Go代碼就比上面的lua代碼復雜太多了,看起來也遠不及lua直接。特別是返回值不是返回值,而是返回值的個數,返回值要往棧里壓。還有參數也不是直接拿到的,而要從棧里面挨個拿。函數調用在形式上像極了匯編語言。

    ls是linux下列出文件和目錄的命令,在Windows下的對應命令是dir。

    GopherLua除了可以滿足基本的lua需要,還將Go語言特有的高級設計直接移植到lua環境中,使得內嵌的腳本也具備了一些高級的特性

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

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

    在這種情況下,catch 塊實際上充當 goto 語句,這通常被認為是有害的(奇怪的是,C 中的關鍵字被認為可以接受的少數用例之一是錯誤后清理,因為該語言沒有 Golang- 樣式延遲語句)。 如果你確實從源頭捕獲異常,你會得到一個不太優雅的。

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

    支持多路復用選擇器select

    golang菜鳥教程

    使用Lua作為內嵌腳本的另外一個重要優勢在于Lua非常輕量級,占用內存極小。接下來我們使用下面的腳本來測試測試單個Lua解釋器實例占用的內存大小。

    上面的代碼開啟了10000個lua解釋器實例,每個解釋器實例調用一次斐波拉契函數輸出結果。然后在退出之前休眠100s便于我們使用top命令觀察進程的內存占用。

    觀察發現在筆者的mac電腦上,整個進程占據了大約1.7G左右的內存。平攤下來大約每個解釋器實例占據170k左右的內存空間,相比Python動輒幾個M大小的空間來說,這已經非常節約了,但實際上lua在節約內存的道路上可以走的更遠。GopherLua提供了對Lua運行時進行裁剪的功能,這能使得它占用的內存更小。

    /* 聲明變量,默認 map 是 nil */

    當內嵌腳本要被終端用戶使用時,需要考慮一些安全問題。比如用戶編寫的腳本代碼使用了lua提供的庫函數訪問了不該訪問的文件,或者調用了一些不該調用的系統模塊。這些不良行為都會給系統帶來威脅,需要進行約束。

    GopherLua可以創建一個非常干凈的Lua解釋器實例,不加載任何系統模塊。然后由程序員自己提供的模塊注冊進去,給內嵌腳本提供一個安全的沙箱運行環境。

    版權聲明:本站文章均來源于網絡,如有侵權請聯系刪除!

    聯系我們

    在線咨詢:點擊這里給我發消息

    QQ:

    工作日:9:30-18:30,節假日休息

    老婆的视频完整版在线观看