skynet
文章平均质量分 75
gneveek
T_T此号终于找回,以后要注意安全。
展开
-
30行代码在skynet中实现预警机器人
1. 预警机器人的定义预警机器人就是当线上有任何错误发生时,它会把错误信息以某种形式通知到某处。2. 思路2.1 报错拦截在 skynet 构建的系统中,报错一般是 lua 引起的,比如 attemp index a nil value, 这些报错的位置虽然分散在成百上千个文件里,但入口其实非常有限,我们只要在入口处拦截掉这些报错,就能把错误信息发送到出去。以下列出不同业务类型其报错的入...原创 2020-01-17 09:54:19 · 525 阅读 · 1 评论 -
skynet 单步调试方案(zbstudio remote debug)
先上效果图: skynet 调试难题skynet 的业务代码全是用 lua 写的,其实现在 lua 的调试工具已经很多了,也有很多好用的,但是由于 skynet 是多服务的,每个服务都是一个 lua 虚拟机,成百上千的 lua vm 导致现有的 lua 调试工具都没法直接使用。虽然云风提供了一个简单的调试控制台,但实在谈不上好用,基于命令行的模式对于用惯各种现代 IDE 调试的我原创 2018-01-05 00:07:33 · 5395 阅读 · 4 评论 -
skynet 某些库导致 attempt to yield across a C-call boundary 错误的问题
问题描述在使用 skynet 提供的一些库的时候,报 attempt to yield across a C-call boundary 的错误。常见的有以下这些: * datasheet * multicast * cluster * sharedata * …比如我们在某个 lua 文件内 require(“skynet.datasheet”), 在运行到这个文件时,会报原创 2018-01-03 16:48:23 · 4088 阅读 · 0 评论 -
lua服务执行过程中协程的挂起和重新唤醒
lua服务在执行回调函数的过程中,调用某些函数会挂起协程,比如skynet.call, skynet.ret, skynet.response等等,这些函数把协程挂起后,如何唤醒呢?本文将对所有调用coroutine.yield的API的唤醒做下分析。(比较拗口,找不到更好的表达方式了)skynet.callfunction skynet.call(addr, typename, ...)原创 2018-01-01 10:59:41 · 2536 阅读 · 0 评论 -
skynet lua服务callback执行过程
lua服务都是通过snlua启动的,snlua服务启动时,最终会通过skynet.start把回调函数设为skynet.dispatch_message。当有消息到达时,先调用到skynet.dispatch_message, 这里面再调到raw_dispatch_messagelocal function raw_dispatch_message(prototype, msg, sz, ses原创 2018-01-01 10:58:53 · 756 阅读 · 0 评论 -
skynet之协程池(co_create)
local coroutine_pool = {}local coroutine_yield = coroutine.yieldlocal function co_create(f) local co = table.remove(coroutine_pool) if co == nil then co = coroutine.create(function(...原创 2017-09-11 20:12:52 · 1732 阅读 · 0 评论 -
skynet.call流程
本来想自己写下这个流程的,但是看到网上有人已经写了,就直接转过来吧,修正了原文中的一处错误。原文:探索skynet(四):服务之间的通信原文内容在《探索skynet(三):消息队列》中已经提到,skynet中每个服务都有自己的地址和消息队列。有了这个基础,理解服务之间的消息通信,就比较简单了。 skynet.call以最常用到的skynet.call为例,它通过调用skynet.core.send转载 2018-01-01 10:56:52 · 2054 阅读 · 0 评论 -
skynet.wakeup分析
官方文档: skynet.wakeup(co) 唤醒一个被 skynet.sleep 或 skynet.wait 挂起的 coroutine 。在 1.0 版中 wakeup 不保证次序,目前的版本则可以保证。唤醒流程调用skynet.wakeup(co)后,会在wakeup_session表内插入一条数据,key=co,value=true.function skynet.wakeup(原创 2018-01-01 10:55:20 · 902 阅读 · 0 评论 -
skynet.sleep分析
官方文档 skynet.sleep(ti) 将当前 coroutine 挂起 ti 个单位时间。一个单位是 1/100 秒。它是向框架注册一个定时器实现的。框架会在 ti 时间后,发送一个定时器消息来唤醒这个 coroutine 。这是一个阻塞 API 。它的返回值会告诉你是时间到了(返回nil),还是被 skynet.wakeup 唤醒 (返回 “BREAK”)。Codefunction s原创 2018-01-01 10:54:38 · 2040 阅读 · 0 评论 -
skynet clientsocket 导致 io.read 无法正确工作的问题
问题描述在使用 clientsocket 之后,使用 io.read() 无法正确读取用户输入。issue 里的讨论关于这个问题,在 skynet 的 issue 里也有人提到: require “clientsocket” 后 io.read()行为改变 #539 io.read()等待读取一行命令行的输入,以回车结束; require “clientsocket”后,io.read(原创 2017-12-31 09:40:03 · 1098 阅读 · 0 评论