zoukankan      html  css  js  c++  java
  • 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)决定。

    server_logger.c

    这里写图片描述
    一个服务中的这四个函数就是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()启动一个服务

    例子解析: 
    这里写图片描述

    这里写图片描述

  • 相关阅读:
    超详细从零记录Hadoop2.7.3完全分布式集群部署过程
    hadoop学习之hadoop完全分布式集群安装
    Fine-tune with Pretrained Models
    Module
    Symbol API
    Gluon parameters 和 Blocks 命名
    mxnet 数据读取
    Adversarial Latent Autoencoders
    A New Meta-Baseline for Few-Shot Learning
    Deploy a plain HTTP registry
  • 原文地址:https://www.cnblogs.com/decode1234/p/11208617.html
Copyright © 2011-2022 走看看