寫在前面
skynet 服務之間有自己的一套高效通信 API 。本文給出簡單的示例。
文章目錄
- 寫在前面
- 準備工作
- 編寫代碼
- 運行結果
準備工作
首先要有一個編譯好,而且工作正常的 skynet 。
編寫代碼
在 skynet/example 目錄編寫一個配置文件,兩個代碼文件。
calc.lua
提供數值計算服務。
local skynet = require "skynet"local CALC = {}-- 處理加法
function CALC.add(...)local res = 0for i, v in ipairs{...} dores = res + vendreturn res
end-- 處理減法
function CALC.sub(lhs, rhs)return lhs - rhs
end-- 處理 lua 消息
function lua_handle(session, source, cmd, ...)local f = assert(CALC[cmd])skynet.ret(skynet.pack(f(...)))
endfunction task()-- 注冊 lua 消息的處理函數skynet.dispatch("lua", lua_handle)
endskynet.start(task)
主服務 main_test
負責啟動 calc ,之后周期發出數值計算請求。
local skynet = require "skynet"local calc_serv = nil-- 初始化函數
function init()math.randomseed(math.floor(skynet.time()))calc_serv = skynet.newservice("calc")
end-- 服務函數
function task()while true do-- 加法local a = math.random(1, 100)local b = math.random(1, 100)local c = math.random(1, 100)local ret = skynet.call(calc_serv, "lua", "add", a, b, c)skynet.error(a .. " + " .. b .. " + " .. c .. " = " .. ret)-- 睡眠三秒skynet.sleep(300)-- 減法local lhs = math.random(1, 100)local rhs = math.random(1, 100)local ret = skynet.call(calc_serv, "lua", "sub", lhs, rhs)skynet.error(lhs .. " - " .. rhs .. " = " .. ret)-- 睡眠三秒skynet.sleep(300)end
end-- 注冊初始化函數
skynet.init(init)-- 啟動服務
skynet.start(task)
配置文件 config_test
-- 啟動多少個工作線程
thread = 8-- skynet 工作在單節點模式下
harbor = 0-- skynet 節點的主程序
start = "main_test"-- lua 服務代碼所在的位置
luaservice = "./service/?.lua;./examples/?.lua"
運行結果
root@macbook:~/skynet# ./skynet examples/config_test
[:00000001] LAUNCH logger
[:00000002] LAUNCH snlua bootstrap
[:00000003] LAUNCH snlua launcher
[:00000004] LAUNCH snlua cdummy
[:00000005] LAUNCH harbor 0 4
[:00000006] LAUNCH snlua datacenterd
[:00000007] LAUNCH snlua service_mgr
[:00000008] LAUNCH snlua main_test
[:00000009] LAUNCH snlua calc
[:00000008] 52 + 77 + 75 = 204
[:00000008] 25 - 56 = -31
...