消息的派发机制是,工作线程,会从global_mq里pop一个次级消息队列来,然后从次级消息队列中,pop出一个消息,并传给context的callback函数,在完成驱动以后,再将次级消息队列push回global_mq中,数据结构如下所示: // skynet_mq.h struct skynet_message { uint32_t source; // 消息发送方的服务地址 // 如果这...
skyent_context_push 和 skynet_context_message_dispatch 先来看出口,skynet_context_message_dispatch。在skynet的启动函数中,我们已经知道skynet_start里面的start(config->thread)启动了 worker等线程: thread_worker(void*p) {//初始化...structmessage_queue * q =NULL;while(!m->quit) {//循环调用 sky...
skynet输出日志通常是调用skynet_error这个api(lua层用skynet.error最后也是调用skynet_error)。查找名称为“logger”对应的ctx的handle id,然后向该id发送消息包skynet_context_push,消息包的类型为PTYPE_TEXT,没有设置PTYPE_ALLOCSESSION标记表示不需要接收方返回。 //skynet_error.c void skynet_error(struct s...
调用skynet_mq_push向消息队列压入一个消息。 然后,调用skynet_globalmq_push把消息队列链到global_queue尾部。 从全局链表弹出一个消息队列,处理队列中的消息,如果队列的消息处理完则不压回全局链表,如果未处理完则重新压入全局链表,等待下一次处理。 描述得比较简单,具体的细节还是要查看skynet_context_message_di...
9、skynet_context_new(logger)加载日志模块。这个函数定义在skynet_server.c 中。 10、bootstrap()加载引导模块。主要在 Skynet 配置文件中定义,默认定义为 bootstrap = "snlua bootstrap",表示引导程序将加载snlua.so 模块,并由 snlua 服务启动 bootstrap.lua 脚本。如果不使用snlua 也可以直接启动其它服务的动...
消息派发的机制:(worker线程 --> global_mq --(pop mq)--> mq --(pop msg)-->context的callback函数 --(push mq)-->global_mq) 工作线程,会从global_mq里pop一个次级消息队列来,然后从次级消息队列中,pop出一个消息,并传给context的callback函数,在完成驱动以后,再将次级消息队列push回global_mq中 ...
skynet_context_new:创建一个新的服务实例。 skynet_context_message_dispatch:分发消息到指定服务。 dispatch_message:处理并分发消息到服务的回调函数。skynet_mq.c 该模块实现了消息队列机制。关键函数包括: skynet_mq_create:创建一个新的消息队列。 skynet_mq_push:将消息推入消息队列。 skynet_mq_pop:从消...
skynet_globalmq_push(queue); if (ret) { skynet_error(ret, "LAUNCH %s %s", name, param ? param : ""); } return ret; } else { skynet_error(ctx, "FAILED launch %s", name); uint32_t handle = ctx->handle; skynet_context_release(ctx); skynet_handle_retire(handle); struct dro...
socket_message -> skynet_socket_message -> skynet_message -> skynet_context_push(message_queue) 通过源码追踪,发现数据都到message_queue了 既然有一个功能是: 把原始数据经过各种封装处理后流向message_queue了 猜测: 那么肯定有一个功能: 使劲的取message_queue,然后把原始数据加工成程序方便使用的对象 ...
skynet_globalmq_push(q); //TODO 为何不判断队列有无消息 q = nq; } skynet_context_release(ctx); return q; } 在dispatch_message完成消息的回调,看下这个函数: // 处理回调函数 static void dispatch_message(struct skynet_context *ctx, struct skynet_message *msg) { ...