文件查找规则
service
luaservice 约束服务只能放在 启动根目录(./) || 启动根目录(./)->service || common->service || skynet_fly->service || skynet->service
cpath
file_util.path_join(skynet_fly_path, '/cservice/?.so;') .. skynet_path .. "cservice/?.so;",
lua_cpath
file_util.path_join(skynet_fly_path, '/luaclib/?.so;') .. skynet_path .. "luaclib/?.so;"
lua_path
--创建 lua文件 查找规则,优先级 启动根目录(./)下非service文件夹 > 启动根目录(./)上上级目录commonlualib文件夹非service文件夹 > skynet_fly lualib下所有文件夹 > skynet lualib下所有文件夹
看到这里,基本上skynet_fly
的核心实现已经看了一半了,现在你绝对可以使用skynet_fly
编写一些独立工作的服务单元。
版本更新[2024.03.04]
github tag
修改原因
由于有使用者发现skynet_fly
在wsl上启动服务很慢,差不多一秒启动一个服务,而skynet
提供的示例还是非常快的,因为wsl访问window文件,因为需要兼容文件系统,所以比访问linux文件要慢很多。起初我怀疑是因为读取文件导致,因为skynet_fly
与skynet
文件相关的差异就是关闭了代码缓存(skynet.codecache “OFF”),每个新启动的服务都需要去完整的读取文件,当我尝试去除这个差异再重启服务时,问题依旧没有改善。后面怀疑到lua_path
上面,因为按照之前我对lua-path
的处理,查找路径可能有几十个,路径多加上路径下的文件多,而require
的加载过程会从头到尾,逐个路径查找,直到找到为止,由于我把skynet
的库优先级排在最低,所以查找过程几乎都跑完了o(n)
的时间复杂度。之后我参数把冗余的3rd
中的路径去除一些,再次启动服务,发现速度快不少,从而确定问题。
解决方案
在实际开发服务中,一般需要require
加载本服库,公共库,skynet_fly库,skynet库。我们只需要把这4个库的根目录写入lua_path,require
文件依赖是使用
本服库.aaa.bbb.ccc的风格引入即可,这样做,不行加载速度快,也更好查找文件的来源。
修改后的luapath 优先级是这样的
1 |
|
风格
本服库
require("enum.code")
公共库
根节点下面创建一个common目录require("common.enum.code")
skynet_fly库
require("skynet-fly.enum.code")
skynet库
require("skynet.enum.code")
由于改成这种风格需要调整到skynet源码,暂时不改动,目前仅把skynet.lualib加上lua_path中,所有加载skynet
与加载本地库的风格是一致的。
server文件夹是指?
是指我们启动服务的根目录。
比如我们启动示例中的 webapp,就需要cd到webapp的根目录然后启动。