skynet.rawcall
理解问题skynet.rawcall
已完成理解「skynet.rawcall」
展开阅读网页
Skynet 是一个分布式无中心节点的系统,它使用 Lua 语言编写,并且提供了一套 API 来实现服务之间的通信和消息处理。skynet.rawcall
是 Skynet 中的一个 API,它允许服务之间进行无协议的消息发送和接收,并且可以等待并获取回应。
skynet.rawcall
的主要特点如下:
- 无协议消息:
skynet.rawcall
允许发送无协议的消息,这意味着发送的消息不需要遵循特定的格式或协议。3 - 同步代码风格:尽管
skynet.rawcall
实现了异步逻辑,但它允许使用同步的代码风格来编写代码,使得代码更加直观易懂。3 - 协程挂起:当使用
skynet.rawcall
发送消息后,当前协程会挂起,直到收到回应或者发生错误。如果目标服务在回应前退出,发送方会收到一个错误。3 - 错误处理:如果尝试通过
skynet.rawcall
与不存在或未启动的服务地址通信,send
操作会返回 0,导致协程挂起,不出错也不返回,这可能会使得后续逻辑难以处理。因此,建议在send
返回的 session 为 0 时,直接报错。5 - 消息回应:
skynet.rawcall
返回的回应包是一个 C 指针和长度,可以直接交给skynet.ret
来回应给原始请求方。10
使用 skynet.rawcall
时,开发者需要注意服务的生命周期和错误处理,以确保系统的稳定性和可靠性。同时,由于其无协议的特性,skynet.rawcall
提供了更大的灵活性,允许开发者根据具体需求定义消息格式。
skynet.call和skynet.rawcall有什么区别?
skynet.call和skynet.rawcall都是Skynet框架中用于服务间通信的函数,但它们之间存在一些关键的区别。首先,"skynet.call"是一个阻塞函数,服务使用它发出请求后会等待应答,如果响应服务退出,会自动给未答复的请求发送一个error消息,告诉它可以从skynet.call阻塞返回了,请求的服务会直接报一个错误;如果响应服务正常,服务会收到响应并继续执行12。而"skynet.rawcall"则是向目标服务发送无协议的消息并返回response,协程挂起等返回,用同步代码的样式实现异步逻辑。当A call B时,如果B在回应前就退出了,A会收到一个错误3。此外,"skynet.call"在发送消息时会进行消息的序列化和反序列化,而"skynet.rawcall"则发送原始数据,不进行序列化9。
skynet.start(start_func)函数的作用是什么?
skynet.start(start_func)函数在Skynet中扮演着启动服务的关键角色。"c服务snlua启动后执行的第一个lua文件里面的主逻辑必定是skynet.start(start_func),由此开始运行lua服务的逻辑"2。start_func是当前lua服务的初始化函数,也是当前服务的第一个协程的函数。这个函数先注册了消息回调函数skynet.dispatch_message,然后调用skynet.timeout,最后通过skynet.init_service(start_func)完成对服务真正意义上的初始化1419。
dispatch_message函数在skynet中扮演什么角色?
dispatch_message函数在Skynet中是消息处理的核心。它是一个消息处理函数,当底层工作线程拿到本服ctx.mq中的一个消息后,会执行这个函数来处理消息2。"dispatch_message将是本服务的发动机(消息驱动机)",每处理完一个消息,都要遍历并执行消息处理过程中fork而没运行的新协程2。对于收到的每个非response消息,它会启动一个新协程来运行协议类型对应的dispatch函数处理消息;对于收到的每个response消息,则根据session从session_id_coroutine取出协程并恢复执行2。
skynet.newservice(name,...)函数是如何创建lua服务的?
skynet.newservice(name,...)函数用于创建一个新的Lua服务。它实际上是通过调用"skynet.call(".launcher", "lua" , "LAUNCH", "snlua", name, ...)"来实现的,其中".launcher"是一个服务的名字,后面的参数都是通过skynet.call传给.launcher的32。"skynet.newservice"的实现会调用"skynet_context_new"模块,用snlua服跑着一个lua逻辑服(service/cmaster.lua),snlua创造了一个lua环境的沙盒2。这个函数是阻塞的,因为它调用了skynet.call,而skynet.call是阻塞的24。
skynet.launch函数是如何创建c服务的?
skynet.launch函数用于创建C服务。它在当前工作线程下调用skynet_context_new创建服务,并且可以指定模块和服务的参数28。"对于skynet.launch("snlua","xxx"),这是创建c服务snlua然后在它上面跑lua服务xxx"2。这个函数是Skynet中创建服务的通用版本,如果要创建一个用C编写的服务,可以使用skynet.launch来实现29。
skynet.rawcall3 | skynet.rawcall 功能 向目标服务发送无协议消息并等待响应,实现同步代码风格的异步逻辑。 |
skynet.rawcall 消息分发6 | 服务消息分发 skynet.rawcall 用于服务间消息分发,处理函数注册与消息回应。 |
skynet.rawcall 与服务通信5 | 服务通信问题 使用skynet.rawcall与不存在或未启动的服务通信时,可能导致协程挂起。 |
skynet.rawcall 与 skynet.call 比较4 | 比较 skynet.rawcall 与 call 在网关与游戏服间数据转发时,rawcall可能比call更适用。 |
skynet.rawcall 消息回应10 | 消息回应处理 在dispatch内,skynet.rawcall返回的回应包可以直接通过skynet.ret回应给请求方。 |
skynet.rawcall3 | Skynet 异步通信 通过skynet.rawcall实现服务间的同步代码样式异步逻辑通信。 |
skynet.rawcall3 | Skynet API 用于发送无协议消息并等待响应。 |