skynet启动流程及调用服务
3.基本原理
3.1启动流程
1.skynet-src/skynet_main.c 这个是main()函数所在,主要就是设置一下lua的环境、默认的配置、打开config配置文件,并修改默认配置。最后调用skynet_start()函数,这个函数在skynet_start.c文件中。
2.skynet-src/skynet_start.c这个文件主要是初始化Skynet的各个模块,包括harbor节点、handle服务ID、mq消息队列、module加载动态链接库、timer时钟、socket套接字以及加载一些服务logger日志服务、master主服务、harbor节点服务、snlua 加载lua模块的服务;以及最后启动几种线程包括_moitor、_timer、_socket和根据线程数启动n个工作线程。
使用snlua加载第一个用户服务
ctx = skynet_context_new(“snlua”, config->start);
//使用snlua加载config->start这个服务,config->start指向配置文件config的start = “main”这行。
3.2调用服务
这个主要在C语言中实现,代码在skynet-src/skynet_server.c的skynet_context_new()函数中,这个函数主要就是实例化服务动态链接库中的”_create()”和”_init()”,以及给服务创建一个私有的消息队列。并填充到struct skynet_context结构中。
skynet_send(),发送消息到队列中,等待调用服务的回调函数。
4.服务
4.1 C语言写服务
service-src/server_logger.c 简介
1、logger_create() 创建服务
2、logger_init() 初始化服务
3、logger_release() 释放服务
4、_logger() 回调函数,这个名字由skynet_callback(_logger)决定。
一个服务中的这四个函数就是Skynet 服务动态链接库的API。这里的logger_create(),其中logger表示的是logger.so的名字,Skynet的module会提取logger.so的名字作并加上”_create”来识别服务中的函数地址。函数的执行顺序是先执行”_create()”再执行”_init()”。而”_release”由skynet_context_release()调用来释放。而回调函数这是其他服务调用这个服务时会去调用它进行处理。服务的主要任务实现就在回调函数中处理。
注:回调函数简介
1.基本定义:
在计算机程序设计中,回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。
2.回调机制:
⑴定义一个回调函数;
⑵提供函数实现的一方在初始化时,将回调函数的函数指针注册给调用者;
⑶当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理。
3.使用时机
先假设有这样一种情况:我们要编写一个库,它提供了某些排序算法的实现(如冒泡排序、快速排序、shell排序、shake排序等等),为了能让库更加通
用,不想在函数中嵌入排序逻辑,而让使用者来实现相应的逻辑;或者,能让库可用于多种数据类型(int、float、string),此时,该怎么办呢?可以使用函数指针,并进行回调。
回调可用于通知机制。例如,有时要在A程序中设置一个计时器,每到一定时间,A程序会得到相应的通知,但通知机制的实现者对A程序一无所知。那么,就需一个具有特定原型的函数指针进行回调,通知A程序事件已经发生。实际上,API使用一个回调函数SetTimer()来通知计时器。如果没有提供回调函数,它还会把一个消息发往程序的消息队列。
另一个使用回调机制的API函数是EnumWindow(),它枚举屏幕上所有的顶层窗口,每个窗口都可以通过它调用另一个程序提供的函数,并传递窗口的处理程序。例如:如果被调用者返回一个值,就继续进行迭代;否则,退出。EnumWindow()并不关心被调用者在何处,也不关心被调用者用它传递的处理程序做了什么,它只关心返回值,因为基于返回值,它将继续执行或退出。
4.2 lua语言服务
用Lua语言写一个服务,最简单的例子在test/testsocket.lua这个服务,它主要实现了回射(echo)功能,客户端发送什么数据给服务端,服务端就像一面镜子把同样的数据反射回去给客户端。
skynet.start()启动一个服务
例子解析:
skynet启动流程及调用服务的更多相关文章
- Linux启动流程和脚本服务-6
授课笔记:----------------------------------- linux系统启动流程:一.初始化阶段:1.grub引导界面2.识别硬件3.初始化驱动 二.加载/etc/rc.d/r ...
- Netty源码分析第1章(Netty启动流程)---->第3节: 服务端channel初始化
Netty源码分析第一章:Netty启动流程 第三节:服务端channel初始化 回顾上一小节的initAndRegister()方法: final ChannelFuture initAndRe ...
- 从Activity的启动流程理解Binder
简述 关于Activity启动流程和Binder的文章很多,大多数是分开来讲的,本文将二者结合起来,着重分析启动流程中跨进程方面的细节,其实,启动流程看似调用繁多,主要是复杂在Activity栈管理等 ...
- Netty 拆包粘包和服务启动流程分析
Netty 拆包粘包和服务启动流程分析 通过本章学习,笔者希望你能掌握EventLoopGroup的工作流程,ServerBootstrap的启动流程,ChannelPipeline是如何操作管理Ch ...
- 【转】Netty 拆包粘包和服务启动流程分析
原文:https://www.cnblogs.com/itdragon/archive/2018/01/29/8365694.html Netty 拆包粘包和服务启动流程分析 通过本章学习,笔者希望你 ...
- Netty源码分析第1章(Netty启动流程)---->第1节: 服务端初始化
Netty源码分析第一章: Server启动流程 概述: 本章主要讲解server启动的关键步骤, 读者只需要了解server启动的大概逻辑, 知道关键的步骤在哪个类执行即可, 并不需要了解每一步的 ...
- Linux操作系统-CentOS6启动流程和服务管理
Linux操作系统-CentOS6启动流程和服务管理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Linux组成 1>.Linux: kernel+rootfs ker ...
- netty服务端客户端启动流程分析
服务端启动流程 我们回顾前面讲解的netty启动流程,服务端这边有两个EventLoopGroup,一个专门用来处理连接,一个用来处理后续的io事件 服务端启动还是跟nio一样,绑定端口进行监听,我们 ...
- cassandra 服务启动流程
cassandra 服务启动流程 1. setup 1) CassandraDaemon ->main publicstaticvoidmain(String[]args) { insta ...
随机推荐
- Codeforces Add on a Tree
Add on a Tree time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- Java的集合框架综述
集合 用于存储和管理数据的实体被称为数据结构(data structure).数据结构可用于实现具有不同特性的集合对象,这里所说的集合对象可以看作一类用于存储数据的特殊对象. 集合内部可以采用某种数据 ...
- javascript正则表达式入门先了解这些
前言 此内容由学习<JavaScript正则表达式迷你书(1.1版)>整理而来(于2020年3月30日看完).此外还参考了MDN上关于Regex和String的相关内容,还有ECMAScr ...
- 使用TensorFlow v2.0构建卷积神经网络
使用TensorFlow v2.0构建卷积神经网络. 这个例子使用低级方法来更好地理解构建卷积神经网络和训练过程背后的所有机制. CNN 概述 MNIST 数据集概述 此示例使用手写数字的MNIST数 ...
- java NIO理解分析与基本使用
我前段时间的一篇博客java网络编程--多线程数据收发并行总结了服务端与客户端之间的收发并行实践.原理很简单,就是针对单一客户端,服务端起两个线程分别负责read和write操作,然后线程保持阻塞等待 ...
- Python——Matplotlib库入门
1.Matplotlib库简介 优秀的可视化第三方库 Matplotlib库由各种可视化类构成,内部结构复杂,受Matlab启发 matplotlib.pyplot是绘制各类可视化图形的命令子库,相当 ...
- Spring钩子接口Aware
前言 我们在编写代码的时候,有的时候想要使用Spring的底层组件,类似于 ApplicationContext, BeanFactory等等 那我们实现Spring提供的钩子方法xxxAware.在 ...
- 【Redis】集群NetCore实战
环境准备 1. Redis集群(Windows集群搭建) 启动Redis集群,给每个节点加上Title start .conf start .conf start .conf start .conf ...
- MySQL从库实用技能(一)--巧用slave_exec_mode参数
想必从库异常中断的情况不在少数,其中报错信息中1032及1062的错误占了不少的比重 错误1032指的是从库中找不到对应行的记录 错误1062指的是主键冲突 遇到此报错时,大多DBA会使用如下方法进行 ...
- ServletConfig&ServletContext对比
上下文初始化参数(ServletContext) Servlet初始化参数(ServletConfig) 部署描述文件 在<web-app>元素中,但是不在具体的<servlet&g ...