分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 前端开发

skynet服务之协程的威力

发布时间:2023-09-06 01:21责任编辑:白小东关键词:暂无标签

????接上一篇分析《skynet服务之launcher》,本篇我们继续来分析一下lua中的协程如何与服务有机结合的,关于lua中协程的解释参见本文《lua中协程的理解》;

上一篇分析到,当一个lua服务收到消息后,在lua层,最终会执行到raw_dispatch_message函数,代码如下:

localfunction raw_dispatch_message(prototype, msg, sz, session, source)
????-- skynet.PTYPE_RESPONSE = 1, read skynet.h
????if prototype ==1then--回应包
????????local co = session_id_coroutine[session]
????????if co =="BREAK"then
????????????session_id_coroutine[session]=nil
????????elseif co ==nilthen
????????????unknown_response(session, source, msg, sz)
????????else
????????????session_id_coroutine[session]=nil
????????????suspend(co, coroutine_resume(co,true, msg, sz))
????????end
????else
????????local p = proto[prototype]
????????if p ==nilthen
????????????if session ~=0then
????????????????c.send(source, skynet.PTYPE_ERROR, session,"")
????????????else
????????????????unknown_request(session, source, msg, sz, prototype)
????????????end
????????????return
????????end
????????local f = p.dispatch
????????if f then
????????????local ref = watching_service[source]
????????????if ref then
????????????????watching_service[source]= ref +1
????????????else
????????????????watching_service[source]=1
????????????end
????????????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)))
????????elseif session ~=0then
????????????c.send(source, skynet.PTYPE_ERROR, session,"")
????????else
????????????unknown_request(session, source, msg, sz, proto[prototype].name)
????????end
????end
end

skynet服务之协程的威力

原文地址:http://www.cnblogs.com/skiing886/p/7761858.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved