skynet dispatch流程

raw_dispatch_message 流程

首先获取dispatch的函数

local f = p.dispatch

并创建coroutine

local co = co_create(f)
session_coroutine_id[co] = session
session_coroutine_address[co] = source
suspend(co, coroutine_resume(co, session,source, p.unpack(msg,sz)))

可以看到创建完协程后,首先调用了coroutine_resume来让协程执行下去


-- suspend is local function
function suspend(co, result, command)
    if not result then
        local session = session_coroutine_id[co]
        if session then -- coroutine may fork by others (session is nil)
            local addr = session_coroutine_address[co]
            if session ~= 0 then
                -- only call response error
                local tag = session_coroutine_tracetag[co]
                if tag then c.trace(tag, "error") end
                c.send(addr, skynet.PTYPE_ERROR, session, "")
            end
            session_coroutine_id[co] = nil
        end
        session_coroutine_address[co] = nil
        session_coroutine_tracetag[co] = nil
        skynet.fork(function() end) -- trigger command "SUSPEND"
        local tb = traceback(co,tostring(command))
        coroutine.close(co)
        error(tb)
    end
    if command == "SUSPEND" then
        return dispatch_wakeup()
    elseif command == "QUIT" then
        coroutine.close(co)
        -- service exit
        return
    elseif command == "USER" then
        -- See skynet.coutine for detail
        error("Call skynet.coroutine.yield out of skynet.coroutine.resume\n" .. traceback(co))
    elseif command == nil then
        -- debug trace
        return
    else
        error("Unknown command : " .. command .. "\n" .. traceback(co))
    end
end

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前几篇讲解了服务之间互相发送消息,消息的挂起,恢复,fork等等,感觉还是有点搞不清他们之间是怎么协作的,例如fo...
    哈罗_aae9阅读 1,800评论 0 1
  • 在实现业务逻辑的过程中,各个逻辑一般会抽象成一个服务,例如游戏中的登录服务,访问数据库服务,创建房间服务等等.服务...
    哈罗_aae9阅读 3,138评论 0 3
  • 在前面的几篇中定时器其实我们已经应用过了,入口函数就是靠定时器驱动的,只不过他的定时为0.参见skynet lua...
    哈罗_aae9阅读 4,177评论 0 0
  • Skynet是多线程框架,其中对应了一些服务(Service),每个服务对应一个Lua虚拟机,一个虚拟机上可以跑多...
    JunChow520阅读 3,676评论 0 0
  • 这是最后一篇了,其实还有很多重要的模块要分析的,但留给以后有多余时间再去研究吧,有兴趣的可以自行下载源码分析。这部...
    fooboo阅读 1,672评论 0 3