金慶的專欄
C++博客
::
首頁(yè)
::
新隨筆
::
聯(lián)系
::
聚合
::
管理
::
423 隨筆 :: 0 文章 :: 454 評(píng)論 :: 0 Trackbacks
公告
我的隨筆
我的評(píng)論
我參與的隨筆
留言簿
(12)
給我留言
查看公開(kāi)留言
查看私人留言
隨筆分類
(502)
1. C/C++(166)
(rss)
2. 網(wǎng)游開(kāi)發(fā)(108)
(rss)
3. Golang(20)
(rss)
4. Linux/Unix(30)
(rss)
5. 軟工與管理(44)
(rss)
6. Python(23)
(rss)
7. Erlang(18)
(rss)
8. Rust(16)
(rss)
9. 其它(77)
(rss)
隨筆檔案
(423)
2023年1月 (1)
2022年11月 (1)
2022年10月 (2)
2022年9月 (1)
2022年4月 (6)
2022年1月 (2)
2021年12月 (4)
2021年11月 (6)
2021年10月 (2)
2021年9月 (2)
2021年8月 (7)
2021年7月 (2)
2021年5月 (2)
2021年3月 (1)
2021年2月 (2)
2021年1月 (1)
2020年12月 (1)
2020年10月 (1)
2020年9月 (5)
2020年8月 (1)
2020年7月 (1)
2020年6月 (1)
2020年4月 (2)
2020年3月 (3)
2020年2月 (3)
2020年1月 (1)
2019年12月 (1)
2019年9月 (2)
2019年4月 (2)
2019年1月 (1)
2018年12月 (1)
2018年11月 (3)
2018年10月 (1)
2018年9月 (3)
2018年8月 (3)
2018年7月 (2)
2018年6月 (4)
2018年5月 (4)
2018年4月 (4)
2018年3月 (1)
2018年1月 (2)
2017年12月 (2)
2017年11月 (3)
2017年10月 (3)
2017年8月 (7)
2017年7月 (1)
2017年6月 (1)
2017年5月 (3)
2017年4月 (3)
2017年3月 (3)
2017年2月 (2)
2017年1月 (2)
2016年12月 (5)
2016年11月 (2)
2016年10月 (2)
2016年9月 (1)
2016年8月 (6)
2016年7月 (3)
2016年6月 (2)
2016年5月 (4)
2016年4月 (2)
2016年3月 (2)
2016年1月 (3)
2015年12月 (2)
2015年11月 (2)
2015年10月 (1)
2015年8月 (2)
2015年7月 (1)
2015年6月 (1)
2015年5月 (4)
2015年4月 (3)
2015年3月 (4)
2015年2月 (5)
2015年1月 (4)
2014年12月 (3)
2014年11月 (3)
2014年10月 (2)
2014年9月 (3)
2014年8月 (1)
2014年4月 (4)
2014年3月 (1)
2014年2月 (4)
2014年1月 (5)
2013年12月 (5)
2013年11月 (5)
2013年9月 (2)
2013年8月 (2)
2013年7月 (2)
2013年6月 (2)
2013年5月 (1)
2013年1月 (2)
2012年12月 (1)
2012年11月 (1)
2012年9月 (1)
2012年8月 (3)
2012年7月 (2)
2012年6月 (1)
2012年4月 (3)
2012年3月 (2)
2012年2月 (3)
2012年1月 (2)
2011年11月 (2)
2011年10月 (3)
2011年9月 (2)
2011年8月 (2)
2011年7月 (3)
2011年6月 (2)
2011年5月 (3)
2011年1月 (2)
2010年12月 (1)
2010年11月 (2)
2010年10月 (2)
2010年9月 (3)
2010年8月 (2)
2010年7月 (3)
2010年6月 (1)
2010年5月 (3)
2010年4月 (3)
2010年3月 (5)
2010年2月 (4)
2010年1月 (4)
2009年12月 (2)
2009年11月 (3)
2009年10月 (4)
2009年9月 (3)
2009年8月 (2)
2009年7月 (4)
2009年6月 (1)
2009年5月 (3)
2009年4月 (4)
2009年3月 (2)
2009年2月 (5)
2009年1月 (1)
2008年12月 (7)
2008年11月 (4)
2008年10月 (1)
2008年9月 (3)
2008年8月 (4)
2008年7月 (3)
2008年6月 (4)
2008年5月 (6)
2008年4月 (7)
2008年3月 (6)
2008年1月 (5)
2007年12月 (7)
2007年11月 (4)
2007年10月 (5)
2007年9月 (6)
2007年8月 (8)
2007年7月 (5)
相冊(cè)
公告照片
搜索
積分與排名
積分 - 653850
排名 - 25
最新評(píng)論
1.?re: boost::asio::spawn 將一統(tǒng)C++網(wǎng)絡(luò)庫(kù)
asio 成為C++首選網(wǎng)絡(luò)庫(kù)
--linda
2.?re: log4cxx中文輸出錯(cuò)誤補(bǔ)丁
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--金慶
3.?re: mingw編譯OrzNet
能發(fā)送一個(gè)mingw編譯好的OrzNet庫(kù)給我嗎? liuweiqcxy@163.com
謝謝!
--劉威
4.?re: log4cxx中文輸出錯(cuò)誤補(bǔ)丁
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--bigbad
5.?re: log4cxx中文輸出錯(cuò)誤補(bǔ)丁
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--bigbad
閱讀排行榜
1.?"multiple definition of" 錯(cuò)誤(11016)
2.?SVN中邪惡的replace(10937)
3.?VS2005編譯libevent(10404)
4.?混音算法的學(xué)習(xí)與研究(10183)
5.?C調(diào)用lua腳本的效率測(cè)試(9002)
評(píng)論排行榜
1.?VC6正在被拋棄(35)
2.?VS2005編譯libevent(21)
3.?"multiple definition of" 錯(cuò)誤(18)
4.?C++引用優(yōu)于指針(17)
5.?ACE與ASIO之間關(guān)于Socket編程的比較(16)
跨服Lua調(diào)用
跨服Lua調(diào)用
(金慶的專欄 2017.3)
跨服Lua調(diào)用是指服務(wù)器集群內(nèi)部A服調(diào)用B服上的腳本。
服務(wù)器之間已經(jīng)實(shí)現(xiàn)RPC調(diào)用,Lua調(diào)用是Rpc調(diào)用的簡(jiǎn)化方式。
示例:
-- Tell remote server svr_id that game_clt_id is disconnected.
local arguments = { "Remote.ClientDisconnected", game_clt_id }
remote_runner.run_mfa(svr_id, "event.dispatcher",
"dispatch", arguments)
以上例子相當(dāng)于調(diào)用了其他服務(wù)器上的代碼:
require("event.dispatcher").dispatch("Remote.ClientDisconnected", game_clt_id)
需要參數(shù)為:
* 遠(yuǎn)程服務(wù)器ID
* Lua模塊名
* Lua模塊中的函數(shù)名
* 調(diào)用參數(shù)列表
remote_runner這樣實(shí)現(xiàn):
-- 運(yùn)行另一服務(wù)器上的Lua代碼
-- 也支持本服運(yùn)行(本服RPC調(diào)用)
local M = {}
local log = require("log"):new("remote_runner")
local pb = require("protobuf")
local serpent = require("serpent")
-- on_result(result) 生成 rpc 回調(diào)函數(shù) cb(resp_str)
local function get_mfa_cb(on_result)
if (not on_result) then return nil end
assert("function" == type(on_result))
local cb = function(resp_str)
assert("string" == type(resp_str))
local resp = pb.decode("svr.RunLuaMfaResponse", resp_str)
local ok, copy = serpent.load(resp.returned_dump)
assert(ok, "Run mfa returns invalid value.")
log:debug("RunLuaMfaResponse: %s", serpent.line(copy))
on_result(table.unpack(copy)) -- 回調(diào)時(shí)執(zhí)行
end -- cb
return cb
end -- get_mfa_cb()
-- Run module function with arguments on remote server.
-- 示例 rum_mfa(123, "event.dispatcher", "dispatch", {"EventName", 1,2,3}, nil)
function M.run_mfa(svr_id, module_name, function_name, arguments, on_result)
assert("number" == type(svr_id))
assert("string" == type(module_name))
assert("string" == type(function_name))
assert("table" == type(arguments))
assert(nil == on_result or "function" == type(on_result))
log:debug("Request to call Svr_%s %s.%s()", svr_id, module_name, function_name)
local req = {
module_name = module_name,
function_name = function_name,
arguments_dump = serpent.dump(arguments)
}
local req_str = pb.encode("svr.RunLuaMfaRequest", req)
local cb = get_mfa_cb(on_result)
c_rpc.request_svr(svr_id, "svr.RunLua", "RunMfa", req_str, cb)
end -- run()
return M
通過(guò)Rpc服務(wù)RunLua.RunMfa實(shí)現(xiàn)。run_lua.proto如下定義
syntax = "proto3";
package svr;
// 服務(wù)器內(nèi)部跨服調(diào)用Lua
service RunLua {
// 運(yùn)行 module.function(...arguments...)
rpc RunMfa(RunLuaMfaRequest) returns (RunLuaMfaResponse);
}
message RunLuaMfaRequest {
string module_name = 1;
string function_name = 2;
// arguments_dump = serpent.dump({1,2,3})
string arguments_dump = 3;
}
message RunLuaMfaResponse {
// Get returned table copy:
// local ok, copy = serpent.load(returned_dump)
string returned_dump = 1;
}
服務(wù)這樣實(shí)現(xiàn):
-- svc_run_lua.lua
-- Run lua by other servers.
local M = {}
local log = require("log"):new("svc_run_lua")
local pb = require("protobuf")
-- Run module.function(...arguments...)
function M.RunMfa(ctx, content)
local req = pb.decode("svr.RunLuaMfaRequest", content)
log:debug("RunMfa %s.%s", req.module_name, req.function_name) -- todo: from where?
local mod = require(req.module_name)
local fun = mod[req.function_name]
local ok, arguments = serpent.load(serpent.dump(req.arguments_dump))
assert(ok, "Illegal arguments.")
local result_table = table.pack(fun(table.unpack(arguments)))
local resp = { returned_dump = serpent.dump(result_table) }
local resp_str = pb.encode("svr.RunLuaMfaResponse", resp)
c_rpc.reply_to(ctx, resp_str)
end -- Run()
return M
posted on 2017-03-02 17:12
金慶
閱讀(458)
評(píng)論(0)
編輯
收藏
引用
所屬分類:
2. 網(wǎng)游開(kāi)發(fā)
只有注冊(cè)用戶
登錄
后才能發(fā)表評(píng)論。
【推薦】100%開(kāi)源!大型工業(yè)跨平臺(tái)軟件C++源碼提供,建模,組態(tài)!
相關(guān)文章:
How are dtLinks created in NavMesh
UE4 Blueprint Multiple Event BeginPlay
第9代游戲主機(jī)
Canvas Scaler 的3種模式
幀同步是否允許客戶端指定命令幀號(hào)
rpc應(yīng)答太快造成請(qǐng)求超時(shí)
測(cè)試 tolua 例子 TestErrorStack
lua變量缺少local造成unity死鎖
C# tolua 之間互傳 byte[]
Unity使用異步grpc
網(wǎng)站導(dǎo)航:
博客園
IT新聞
BlogJava
博問(wèn)
Chat2DB
管理
Powered by:
C++博客
Copyright © 金慶
中文国产成人精品久久不卡
|
久久人人爽人人人人片av
|
亚洲精品tv久久久久久久久久
|
久久久久久久免费视频
|
久久精品aⅴ无码中文字字幕不卡 久久精品aⅴ无码中文字字幕重口
|
久久精品国产亚洲AV无码娇色
|
欧美日韩中文字幕久久伊人
|
2021最新久久久视精品爱
|
久久99精品综合国产首页
|
国产成人综合久久精品红
|
久久精品国产精品青草
|
噜噜噜色噜噜噜久久
|
久久九九全国免费
|
亚洲综合精品香蕉久久网
|
久久精品国产欧美日韩
|
AV狠狠色丁香婷婷综合久久
|
午夜福利91久久福利
|
久久青草国产精品一区
|
久久人人爽人人爽人人片av麻烦
|
91久久精品国产91性色也
|
人妻少妇久久中文字幕
|
久久伊人色
|
www.久久热.com
|
2020最新久久久视精品爱
|
狠狠精品久久久无码中文字幕
|
日本免费一区二区久久人人澡
|
国产A三级久久精品
|
久久最新免费视频
|
久久精品国产亚洲AV不卡
|
热久久国产精品
|
人人狠狠综合久久亚洲婷婷
|
久久精品国产亚洲AV高清热
|
久久水蜜桃亚洲av无码精品麻豆
|
精品久久久久久久久久中文字幕
|
久久国产色AV免费看
|
色欲综合久久躁天天躁蜜桃
|
久久香综合精品久久伊人
|
亚洲精品午夜国产va久久
|
久久久久久亚洲精品影院
|
国产精品久久新婚兰兰
|
18岁日韩内射颜射午夜久久成人
|