【从零开始学Skynet】基础篇(三):服务模块常用API

这篇具有很好参考价值的文章主要介绍了【从零开始学Skynet】基础篇(三):服务模块常用API。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、服务模块       

          Skynet提供了开启服务和发送消息的API,必须要先掌握它们。列出了Skynet中8个最重要的API,PingPong程序会用到它们。

Lua API 说明
newservice(name, ...)

启动一个名为 name 的新服务,并返回服务的地址。

start(func)         用 func 函数初始化服务,并将消息处理函数注册到 C 层,让该服务可以工作。
dispatch(type, func) 

        为 type 类型的消息设定一个处理函数。Skynet支持多种消息类型,由于Lua服务间的消息类型是“lua”,因此这里暂时将它定为“lua”。func是指收到消息后的处理函数,当一个服务收到消息时,skynet就会开启新协程,并调用它。       

send(addr, type, ...)

        用 type 类型向 addr 发送一个消息,消息名为cmd。发送方用skynet.send发送消息,接收方用skynet.dispatch接受消息,它们的参数相互对应。若用于服务间通信,类型一般固定为“lua”

call(addr, type, ...) 用 type 类型发送一个消息到 addr ,并等待对方的回应。skynet.call是个阻塞方法。
exit()

结束当前服务。

self() 返回当前服务的地址。
error(msg) 打印日志,向 log 服务发送一条消息。

更多API可以参见:https://github.com/cloudwu/skynet/wiki/APIList

 2、程序开发 

        初看API文档可能一头雾水,结合下面的实例开发才能融会贯通。

        按如下图所示,开启两个ping类型的服务ping1和ping2,让ping1给ping2发消息,ping2收到

后回应ping1,ping1收到再回应ping2,不断循环。

【从零开始学Skynet】基础篇(三):服务模块常用API

3、代码实现 

(1)主服务

           在skynet/examples目录下新建main_ping.lua文件,输入如下所示代码:

local skynet = require "skynet"
skynet.start(function()
    skynet.error("[PingMain] start")
    local ping1 = skynet.newservice("Ping")
    local ping2 = skynet.newservice("Ping")

    skynet.send(ping1, "lua", "start", ping2)
    skynet.exit()
end)
  1. 主服务启动服务后,会先打印“[PingMain]start”的日志输出;
  2. 然后开启两个 ping 类型的服务,它们的地址分别存为ping1 ping2
  3. 再调用 skynet.send ,让主服务向 ping1 发送名 为“start” 的消息(图中的阶段 ),附带一个参数 ping2
  4. 最后,主服务完成使命,退出

(2)ping服务

         在skynet/examples目录下新建ping.lua文件,输入如下所示代码:

local skynet = require "skynet"

local CMD = {}

function CMD.start(source, target)
    skynet.send(target, "lua", "ping", 1)
end

function CMD.ping(source, count)
    local id = skynet.self()
    skynet.error("["..id.."] recv ping count="..count)
    skynet.sleep(100)
    skynet.send(source, "lua", "ping", count+1)
end

skynet.start(function()
    skynet.dispatch("lua", function(session, source, cmd, ...)
      local f = assert(CMD[cmd])
      f(source,...)
    end)
end)
    为使代码简洁,两个回调方法都使用了匿名函数。代码说明:
  1. 先用skynet.start初始化服务;
  2. 然后在回调方法中调用skynet.dispatch,指定lua类型消息的处理方法,参数session代表消息的唯一id,可暂时先不管。source代表消息来源,指发送消息的服务地址,cmd代表消息名,“...”是一个可变参数,内容由发送方的skynet.sendskynet.call指定。       
  3. 收到其他服务的消息后,查找CMD[cmd]这个方法是否存 在,如果存在就调用它;
  4. ping1服务收到主服务的“start”消息时,程序会调用CMD.start(source, ...)。其中,参数source代表消息来源,其他参数由发送方传送。
  5. ping服务可以接收两种消息:一种是主服务发来的start消息;另一种是其他ping服务发来的ping消息。
        主服务会在启动两个ping 服务后给 ping1 发送 start 消息,语句 是“skynet.send(ping1, "lua", "start", ping2) ,最后一个参数对应CMD.start的参数 target ,代表要让 ping1 发消息给谁。 ping1 收到后,会给ping2 发送一条 ping 消息,附带参数 “1” ping2 收到后,执行CMD.ping,参数 “1” 对应参数 count ping2 也会给 ping1 (发送方 source)发送 ping ,并把记数值 count 1 ,如此往复。

(3)配置文件

        在 skynet/examples目录下新建 PingConfig文件,然后把config中的内容复制过来稍加修改,内容如下所示:
include "config.path"

thread = 8
logger = nil
logpath = "."
harbor = 0
start = "main_ping"	-- main script
bootstrap = "snlua bootstrap"	-- The service for bootstrap
-- snax_interface_g = "snax_g"
cpath = root.."cservice/?.so"
-- daemon = "./skynet.pid"

(4)运行结果

        最后打开终端,输入如下指令,显示运行结果。

【从零开始学Skynet】基础篇(三):服务模块常用API文章来源地址https://www.toymoban.com/news/detail-411321.html

        其中0000000a10 代表 ping2 的地址(一个十六进制一个十进制,它们是相同的值,根据不
同配置,读者看到的数值可能不同),00000009 9 代表 ping1 的地址。 ping2 先打印出计数值 1
接着 ping1打印出计数值 2 ,然后 ping2 再打印出计数值 3 ,以此类推。

到了这里,关于【从零开始学Skynet】基础篇(三):服务模块常用API的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 从零开始实现一个C++高性能服务器框架----环境变量模块

    此项目是根据sylar框架实现,是从零开始重写sylar,也是对sylar丰富与完善 项目地址:https://gitee.com/lzhiqiang1999/server-framework 项目介绍 :实现了一个基于协程的服务器框架,支持多线程、多协程协同调度;支持以异步处理的方式提高服务器性能;封装了网络相关的模块,包括

    2024年02月02日
    浏览(55)
  • 从零开始实现一个C++高性能服务器框架----Hook模块

    此项目是根据sylar框架实现,是从零开始重写sylar,也是对sylar丰富与完善 项目地址:https://gitee.com/lzhiqiang1999/server-framework 项目介绍 :实现了一个基于协程的服务器框架,支持多线程、多协程协同调度;支持以异步处理的方式提高服务器性能;封装了网络相关的模块,包括

    2023年04月09日
    浏览(101)
  • 从零开始实现一个C++高性能服务器框架----Socket模块

    此项目是根据sylar框架实现,是从零开始重写sylar,也是对sylar丰富与完善 项目地址:https://gitee.com/lzhiqiang1999/server-framework 项目介绍 :实现了一个基于协程的服务器框架,支持多线程、多协程协同调度;支持以异步处理的方式提高服务器性能;封装了网络相关的模块,包括

    2023年04月08日
    浏览(59)
  • Spring Cloud--从零开始搭建微服务基础环境【四】

    😀前言 本篇博文是关于Spring Cloud–从零开始搭建微服务基础环境【四】,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉 💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客

    2024年02月09日
    浏览(47)
  • Spring Cloud--从零开始搭建微服务基础环境【二】

    😀前言 本篇博文是关于Spring Cloud–从零开始搭建微服务基础环境【二】,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉 💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客

    2024年02月10日
    浏览(54)
  • Spring Cloud--从零开始搭建微服务基础环境【三】

    😀前言 本篇博文是关于Spring Cloud–从零开始搭建微服务基础环境【三】,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉 💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客

    2024年02月09日
    浏览(42)
  • SpringCloud--从零开始搭建微服务基础环境入门教程【一】

    😀前言 本篇博文是关于SpringCloud–从零开始搭建微服务基础环境入门教程【一】,希望你能够喜欢😉 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉 💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来

    2024年02月10日
    浏览(53)
  • C++ Webserver从零开始:基础知识(三)——Linux服务器程序框架

    目录 前言 一.服务器编程基础框架 C/S模型 主要框架 二.I/O模型 阻塞I/O 非阻塞I/O 异步I/O 三.两种高效的事件处理模式 Reactor Proactor 四.模拟Proactor模式 五.半同步/半异步的并发模式 六.有限状态机 七.其他提高服务器性能的方法 池 数据复制 上下文切换和锁         这一章是

    2024年02月22日
    浏览(55)
  • 从零开始学JAVA——常用类

    将字符串“2016-02-22”转换为对应的java.sql.Date类的对象 new+构造器 单例、Calendar.getInstance() 解释何为编码?解码?何为日期时间的格式化?解析? 编码:字符串–字节 解码:字节–字符串 格式化:日期–字符串 解析:字符串–日期 自定义Person类如下,如何实现自然排序(按

    2024年02月11日
    浏览(43)
  • 从零开始学Python第14课:函数和模块

    在讲解本节课的内容之前,我们先来研究一道数学题,请说出下面的方程有多少组正整数解。 x 1 + x 2 + x 3 + x 4 = 8 x_1 + x_2 + x_3 + x_4 = 8 x 1 ​ + x 2 ​ + x 3 ​ + x 4 ​ = 8 你可能已经想到了,这个问题其实等同于将8个苹果分成四组且每组至少一个苹果有多少种方案,也等价于在分

    2024年02月06日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包