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
输出结果

注意我们使用NewState得到一个独立的Lua解释器实例,后续的所有操作都是基于这个实例内部进行的,全局状态限于L对象内部,没有进程级别的全局状态。如果要得到多个解释器实例,使用NewState多创建几个就行。
也许你会想到golang有如此多的goroutine,难道要每个goroutine都开一个lua解释器实例么,如果这样,内存肯定是要被撑爆的。
GopherLua考虑到了这点,它使用解释器实例池解决了这个问题。当用户想要使用Lua解释器时,从池中取出一个,用完了再还回去。因为同一个解释器可能要被多个协程使用,虽然不是同一时间被多个协程使用,要注意全局状态不要相互干扰。进入专栏继续阅读