作者:shihuaping0918@163.com,转载请注明作者
第5篇讲到了消息的处理,消息的处理实际上就是对工作队列里的消息不停地调回调函数。那么消息是怎么放进消息队列的呢。带着这个疑问,让我们从lua层开始追根溯源。
在lua层有两个api,一个是skynet.send,这个是非阻塞发消息。另一个是skynet.call,这个是阻塞式发完消息等回应。skynet.call使用一个session来实现等待,这个session实际就是一个自增的数字,溢出了以后又从1开始。
以skynet.send为例进行分析。skynet.send位于skynet/lualib/skynet.lua文件中。
function skynet.send(addr, typename, ...)
local p = proto[typename]
return c.send(addr, p.id, 0 , p.pack(...)) -- c就是skynet.core
end
可以看出skynet.send实际上是调了skynet.core里的send函数。而skynet.core的定义在skynet/lualib-src/lua-skynet.c这个文件中。因为下面有一部分代码涉及到lua c api,这部分我不打算说明了。
LUAMOD_API int
luaopen_skynet_core(lua_State *L) { //这个就是skynet.core
luaL_checkversion(L);
luaL_Reg l[]