第一棵蛋
每个snlua服务对应一个lua状态机
每个消息对应一个coroutine
--skynet.raw_dispatch_message
-- 每个消息都创建一个coroutine
local co = co_create(f)
suspend(co, coroutine.resume(co, session,source, p.unpack(msg,sz, ...)))
一对好基友
call和response是一对好基友,服务A 调用call方法到服务B后, 服务B要应答时调用response+结果R即可,这个时候服务A中的call返回,返回就是结果R.
skynet.call
skynet.response
再一对好基友
resume和yield也是一对好基友。reume和yield分别在2个代码快A和B中。协程穿越者W是一个隐形的码灵,它按顺序一行一行的执行当前lua代码,在A和B代码块中来回穿针引线。码灵不是时空跳跃者,它只是穿行,不会在某处就消失掉。
它要么在代码块A中,要么就在代码块B中,每次穿越,嘴里都衔着上一个时空的口袋(实参),丢到当前的时空。当然口袋里可能是空的。
一开始coroutine(主函数co_main)是挂起的
首先A resume(...),A立即挂起到A1,码灵背着口袋去到B,B开始从co_main执行, 其实参正是resume(...)传入的值
B继续走,遇到yiled(...)就停住了,挂起到B1
码灵从B1门回到A 的A1门,A1门关闭
码灵在A中继续走,遇到resume,停下来开了一道门A2
码灵从A的A2门进到B中的B1门,B1门关闭
码灵在B中继续走,遇到yield停住,又开了个B2门
这样周而复始,在时空A和时空B中每次都会有另外一个空间的门开着,当前空间遇到停住,就打开门进到对方时空。
这淡扯得有点离谱啊!
rapidjson来一蛋
先在skynet里这样定义一个table
-------------------------------------------------
{
{ id = 1, name = "map1", ip = "127.0.0.1", port = "5555" },
{ id = 2, name = "map2", ip = "127.0.0.2", port = "5556" },
}
然后在client这样解析:
-------------------------------------------------
Document document;
document.Parse(params.c_str());
if(!document.HasMember("maps"))
return;
Value map = document["maps"].GetObject();
for(Value::ConstMemberIterator itr = map.MemberBegin(); itr != map.MemberEnd(); ++itr)
{
}
问题来了:
1.只能解析到id=2的table出来
2.再追加个id=3,就地址异常了。
解决
ID从0开始
这蛋甚是无味
好像是sproto中如果type被用作数组类型,必须第一个字段是id,后面填充的时候也要从0开始
<占位标题>
<占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述>
<占位项1>
<占位项2>
<占位标题>
<占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述>
<占位项1>
<占位项2>
<占位标题>
<占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述>
<占位项1>
<占位项2>
<占位标题>
<占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述>
<占位项1>
<占位项2>
<占位标题>
<占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述>
<占位项1>
<占位项2>